解法1

直接暴力 或者外循环列 内循环二分查

运行时间:113ms 占用内存:17496KB

public class Solution {
    public boolean Find(int target, int [][] array) {

        for(int i=0;i<array.length;i++){
            int left = 0 ;
            int right = array[0].length-1;
            while(left<=right){
                int mid = (left+right)/2;
                if(array[i][mid]>target){
                    right = mid-1;
                }else if(array[i][mid] <target){
                    left = mid+1;
                }else{
                    return true;
                }
            }
        }
        return false;
    }
}

解法2

因为输入的二维数组是有规律的

  • 每一行都按照从左到右递增的顺序排序

  • 每一列都按照从上到下递增的顺序排序
    举个例子:

    1 2 8  9 
    2 4 9  12 
    4 7 10 13 
    6 8 11 15 

    6是第一列最大的 第四行最小的。 如果需要查找的元素target 比6小 那么说明 6的右边的元素都不用比了,直接上升一层就好了,如果target比6大 那么就说明 6上面的元素都不用比了 直接走右边一层就好了。

    运行时间:113ms 占用内存:17496KB

    public class Solution {
      public boolean Find(int target, int [][] array) {
       int row = array.length-1;
          int col = 0;
          while(row>=0 && col < array[0].length ){
              if(array[row][col]>target){
                  row -=1;
              }else if(array[row][col] < target){
                  col +=1;
              }else{
                  return true;
              }
          }
          return false;
      }
    }