除了暴力解法还有二分法的思想,二分主要是找到一个中间值与其作对比,在这个二维数组里的中间值肯定是那个不大不小的点,就是边角点,这个时候可以考虑到 右上角和左下角点,从这个点开始判断:
- 目标值比其大就往下走,行数++
- 目标值比其小就往左走,列数--
这里面也有二分法的思想,二分查找在判断之后会改变strat与end的值,这样一大截没用部分就不会计入考虑,这道题思想也是雷同,由于前后左右都是有序的,所以每走一步都会抛弃一大部分,减少判断数量。
代码如下:
public class Solution {
public boolean Find(int target, int [][] array) {
int len1=array.length;
int len2=array[0].length;
int i=0,j=len2-1; //遍历节点位置
while(i<len1&&j>=0){
if(array[i][j]==target) return true;
else if (array[i][j]<target) i++;
else j--;
}
return false;
}
}