题目描述
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
思路一:
根据题目可知,从array[0][0]往右或者往下都是增加,那么我们应该选择右上的顶点或者左下的顶点。因为只有这两个点,往行、列两个方向移动的时候,是一条增,一条减。而如果选择左上或者右下,那么两条路都是增或者都是减,会引起岔路。所以选择右上或者左下。
例如选择右上,则此点为array[0][array[0].length-1]。target点与该点比较,如果target大,则j++。如果target小,则i--。直到顶点转到a[i][j]与target一样大。
public class Solution {
public boolean Find(int target, int [][] array) {
int row=0;
int col=array[0].length-1;
while(row<=array[0].length-1&col>=0){
if(target==array[row][col]){
return true;
}
else if(target>array[row][col]){
row++;
}
else{
col--;
}
}
return false;
}
}
然后看了讨论区之后,还有第二个思路,是基于遍历每行,每行内进行二分查找(基于每行已经排序好)。不过这种思路没有用到每行递增的条件,个人感觉不是很好。
附上别人代码:
public class Solution {
public boolean Find(int target, int [][] array) {
for(int i=0;i<array.length;i++){
//定义每行两端点
int low=0;
int high=array[i].length-1;
while(low<=high){
//定义中间点
int mid=(low+high)/2;
if(target<array[i][mid])
high=mid-1;
else if(target>array[i][mid])
low=mid+1;
else
return true;
}
}
return false;
}
}