思路1:

  1. 从右上角开始查找,左边的都比它小,下面的都比它大
  2. 循环遍历,如果比target小,则m++;比target大,则n--;相等就直接return
  3. 循环退出条件,当m<array.length && n>=0,也就是遍历到左下角
public class Solution {
    public boolean Find(int target, int [][] array) {
        //m、n初始值,为右上角的横竖坐标
        int m=0;
        int n=array[0].length-1;
        
        //进入循环,判断条件为到左下角
        //如果比target小,则m++;比target大,则n--;相等就直接return true
        while(m<array.length && n>=0){
            int a=array[m][n];
            if(a<target){
                m++;
            }else if(a>target){
                n--;
            }else{
                return true;
            }
        }
        
        //循环结束,说明不存在target,返回false
        return false;
    }
}
  • 时间复杂度:最坏情况是从右上角遍历到左下角,走过的路程是m+n,时间复杂度为O(m+n)
  • 空间复杂度:O(1)