[剑指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;
    }
}
日积月累,水滴石穿
原文地址:https://www.cnblogs.com/lonelyisland/p/14381781.html