剑指 Offer 04. 二维数组中的查找
题目描述:
在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
示例:
现有矩阵 matrix 如下:
[
[1, 4, 7, 11, 15],
[2, 5, 8, 12, 19],
[3, 6, 9, 16, 22],
[10, 13, 14, 17, 24],
[18, 21, 23, 26, 30]
]
给定 target = 5,返回 true。
给定 target = 20,返回 false。
限制:
0 <= n <= 1000
0 <= m <= 1000
一直显示超时,不知道为啥
1 class Solution { 2 public int findNUmberInArray(int[] array,int target,int lo,int hi){ 3 hi=array.length; 4 int mid; 5 while(lo<hi){ 6 mid=(lo+hi)>>2; 7 if(target<mid) 8 hi=mid; 9 else 10 lo=mid+1; 11 } 12 13 return lo-1; 14 15 16 17 } 18 public boolean findNumberIn2DArray(int[][] matrix, int target) { 19 int lo=0,hi=matrix[0].length; 20 for(int i=0;i<matrix.length;i++){ 21 int m=findNUmberInArray(matrix[i],target,lo,hi); 22 if(m<0) 23 return false; 24 else if(matrix[i][m]==target) 25 return true; 26 else 27 lo=m; 28 } 29 30 31 return false; 32 } 33 }
我知道了,问题出在mid=(lo+hi)>>2;应该是右移一位。
被折叠的代码有很多问题,在idea上改了改去才发现,包括target和mid比较这种错误。
修改后的代码如下,获得了满分。我又想复杂了,其实比起暴力破解改善不是很明显,还不如直接暴力搜索来的简单。
1 class Solution { 2 private static int findNUmberInArray(int[] array,int target,int lo,int hi){ 3 int mid; 4 while(lo<hi){ 5 mid=(lo+hi)>>1; 6 if(target<array[mid]) 7 hi=mid; 8 else 9 lo=mid+1; 10 } 11 return lo-1; 12 } 13 14 public boolean findNumberIn2DArray(int[][] matrix, int target) { 15 if (matrix == null || matrix.length == 0 || matrix[0].length == 0) { 16 return false; 17 } 18 int lo=0,hi=matrix[0].length; 19 for(int i=0;i<matrix.length;i++){ 20 int m=findNUmberInArray(matrix[i],target,lo,hi); 21 if(m<0) 22 continue; 23 if(matrix[i][m]==target) 24 return true; 25 26 } 27 return false; 28 } 29 30 31 32 }
有几个问题待解决:
1数组在java中是什么,为什么可以有数组名.length这种操作?
2数组在java和c++中是有区别的,c++中可以有数组a=数组b这种操作吗?java中这样表示两个数组指向同一个。数组名是否等于null怎么理解?
3为什么在leetcode中的自定义函数要设置成private?

浙公网安备 33010602011771号