题目难度:中等
题目考察:尺取,枚举
题目描述
给你一个数字target和一个二维数组,查找二维数组内是否存在数字,存在返回true,不存在返回false。
题目链接
算法1(暴力枚举):
题目要确定二维数组内是否存在某个值,简单的思路就是暴力枚举具体做法如下
定义一个bool变量flag,遍历二维数组,存在这个数字即将flag变为true,最后返回flag即可
代码如下:

class Solution {
public:
    bool Find(int target, vector<vector<int> > array) {
        int flag=0;
        for(int i=0;i<array.size();i++) 
            for(int j=0;j<array[i].size();j++)
                //枚举二维数组里的每一个数
                if(array[i][j]==target)
                 {
                    flag=1;
                    return flag; 
                    //找到相等的数返回1
                 }
            return false;
            //没找到返回0
}; 
}

遍历了二维数组,所以时间复杂度O(n^2)
没有额外空间,空间复杂度O(1)
但是没有用到题目中的性质,明显不是最优解,下面来进行优化
算法2(利用单调性双指针):
二维数组是从左向右单调的,从上到下也是单调的,
图片说明
上面每次移动都是因为二维数组是从左向右单调的,从上到下也是单调的,所以可以保证正确性,
因此时间复杂度就降为了O(行+列)
下面给出代码

class Solution {
public:
    bool Find(int target, vector<vector<int> > array) {
         if(array.size()==0||array[0].size()==0) return false;
            //特判空数组返回false
        int x=array[0].size()-1;
        int y=0;
            //从右上角开始移动
        while (x>=0&&y<array.size()){
            if(target==array[y][x])  return true;
                //只要找到了就直接返回false
            if(target>array[y][x]) y++;
                //向下移动
            else x--;
            //当前行大于target,向左移动
        }
        return false;
        //没找到返回false
    }
};

时间复杂度O(行+列)
空间复杂度O(1)