解法1:从右上角开始找,左边的都是比它小的,下边的都是比它大的。

  • 如果当前元素等于target,那么说明找到了,返回true;
  • 如果当前元素大于target,那么当前元素下面的一定都比target大,所以左移;
  • 如果当前元素小于target,那么当前元素左面的一定都比target小,所以下移;
  • 如果最后没返回true,则返回false。
    时间复杂度:O( m + n ): m为矩阵的行数,n为矩阵的列数
      public static boolean Find(int[][] array,int target){
          int row=0;
          int col=array[0].length-1;
          while(row<array.length && col>=0){//判断停止的条件
              if(array[row][col]==target){
                  return true;
              }
              else if(array[row][col]<target){
                  row++;//A<target说明要向下寻找
              }
              else{
                  col--;//A>target说明要向左寻找;
              }
          }
          return false;
      }

    解法2:二分查找

      public boolean searchMatrix (int[][] matrix, int target) {
          // write code here
          if(matrix == null || matrix.length == 0 || matrix[0].length == 0) return false;
          int m = matrix.length;
          int n = matrix[0].length;
          int start = 0,end = m*n-1;
          while(start <= end){
              int mid = (start+end)/2;
              int val = matrix[mid/n][mid%n];
              if(val < target){
                  start = mid+1;
              }else if (val > target){
                  end = mid-1;
              }else{
                  return true;
              }
          }
          return false;
      }