解法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; } }