剑指offer(一):二维数组中的查找

题目描述:

在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

分析:

二维数组的定义:
剑指offer(一):二维数组中的查找
最直观的解题思路是找到一个数和target对比,如果大或者小,接下来怎么办。
但是,找到比较的数,这个数的选择是关键的。因为比较完只能有三个结果:相等则return,大的话往小的方向走,再继续比较。小的话往大的方向走,再继续比较。经过模拟,可以知道这个比较的数需要选在左上角或者右下角。
以下这个图来自https://cuijiahua.com/blog/2017/11/basis_1.html。
剑指offer(一):二维数组中的查找
代码中找的点是右上角。

代码:

class Solution {
public:
    bool Find(int target, vector<vector<int> > array) {
        int rowNum = array.size();
        int culNum = array[0].size();
        if(!array.empty()&&rowNum>0&&culNum>0){
            int i=rowNum-1;
            int j=0;
            while(i>=0&&j<culNum){
                int cur=array[i][j];
                if(cur==target)
                    return true;
                else if(cur<target){
                    j++;
                }
                else
                    i--;
            }
        }
       return false;
    }
};