剑指offer在线编程——二维数组查找
问题描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数.
思考:题目所述二维数组最大的特点就是每一行递增,每一列也是递增的。考虑到这个特点,我们采取从二维数组左下角或右上角开始遍历,这样如果比目标值小,则右移,若比目标值大,则下移。
代码解答:
public class Solution {
public boolean Find(int [][] array,int target) {
int rowLength = array.length; //二维数组的行宽
boolean isFind=false; //查找状态
if(array !=null && array[0].length!=0){ //判断数组是否为空,边界判断
for(int row=rowLength-1;row>=0;row--){ //从二维数组左下角开始遍历
if(array[row][0]<=target){ //如果目标值大,则右移
for(int col=0;col<array[row].length;col++){
if(target == array[row][col]){
isFind =true;
return isFind;
}
}
}
}
}
return isFind;
}
}
上面方法比较复杂,下面介绍一种二分查找的解法,是采用别人的:
public class Solution { public boolean Find(int [][] array,int target) { 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]) low=mid+1; else if(target<array[i][mid]) high=mid-1; else return true; } } return false; }}下面是第三种解法:
public class Solution { public bool Find(vector<vector<int> > array,int target) { int m,n,x,y; m = array.size();//行数 n = array[0].size();//列数 x=m-1;y=0;//坐标定在左下角 while(x>=0 && y<=n-1){ if(target<array[x][y]){ x--;//遇小上移 } else if(target>array[x][y]){ y++;//遇大右移 } else { return true; } } return false; }}
浙公网安备 33010602011771号