在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
方法一:每次去掉一行或一列,具体如下:
** 每次选取数组中右上角的数字,这里分三种情况。**
1、当右上角的数字正好等于要查找的数字时,返回true
2、当右上角的数字大于要查找的数字时,删除一列,j–
3、当右上角的数字小于要查找的数字时,删除一行,i++
重复上面操作,直到数组越界
public class Solution {
public boolean Find(int target, int [][] array) {
int row=array.length,column=array[0].length; //row记录行,locumn记录列
int i=0,j=column-1; //i记录起始行,j记录最后列
while(i<row && j>=0){
if(array[i][j]==target){
return true; //1、当右上角的数字正好等于要查找的数字时,返回true
}else if(array[i][j]>target){
j--; //2、当右上角的数字大于要查找的数字时,删除一列,j--
}else{
i++; //3、当右上角的数字小于要查找的数字时,删除一行,i++
}
}
return false; //4、数组越界,没有找到对应数据
}
}
方法二:遍历每一行,每一行用二分查找进行搜索
public class Solution {
public boolean Find(int target, int [][] array) {
for(int i=0;i<array.length;i++){
if(judgeLine(array,target,i)){ //判断每行是否有target
return true;
}
}
return false;
}
public boolean judgeLine(int[][] array,int target,int line){ //二分查找
int low=0,high=array[line].length-1;
while(low<=high){
int mid=(low+high)/2;
if(array[line][mid]==target){
return true;
}else if(array[line][mid]>target){
high=mid-1;
}else{
low=mid+1;
}
}
return false;
}
}