[剑指offer]二维数组中的查找
二维数组中的查找
题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
例如:下面的二维数组就是每行、每列都递增排序。如果在这个数组中查找数字7,则返回true;如果查找数字5,由于数组不含有该数字,则返回false。
思路1
观察特点,以左下角元素为起点,上方的元素都比这个数小,右边的元素都比这个数大。所以如果target与array[i][j]比较的三种形式
- 相等,true
- 小于,i--,往上方元素找
- 大于,j++,往右方元素找
类似的可以推出起点在右上角的情况,主要是通过区分一大一小可以确定下一个比较元素的大致寻找方向。左下角为起点的代码如下
public class Solution {
public boolean Find(int target, int [][] array) {
int rows = array.length;
int cols = array[0].length;
int i = rows - 1,j = 0;
while(i >= 0 && j < cols){
if(target == array[i][j])
return true;
if(target < array[i][j]){
i--;
continue;
}
if(target > array[i][j]){
j++;
continue;
}
}
return false;
}
}
思路2
对每一行进行二分查找,逐行进行遍历
public class Solution {
public boolean Find(int target, int [][] array) {
int rows = array.length;
int cols = array[0].length;
for(int i = 0; i < rows; i++){
int low = 0;
int high = cols - 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;
}
}
日积月累,水滴石穿