给定一个二维数组,其每一行从左到右递增排序,从上到下也是递增排序。给定一个数,判断这个数是否在该二维数组中。
解题思路
要求时间复杂度 O(M + N),空间复杂度 O(1)。
特性:该二维数组中的一个数,它左边的数都比它小,下边的数都比它大。
因此,从右上角开始查找,就可以根据 target 和当前元素的大小关系来缩小查找区间,当前元素的查找区间为左下角的所有元素。
举个例子:目标比 15 大,就跳到下一行,与 19 判断,目标比 19 大就自动跳到下一行,比 19 小就同行后退一个单位再进行比较。
目标比这个数字大的话,就跳到下一行再进行比较。目标比它小的话,就再同行后退一个单位。
------------------------------------------------------------------------------------------------------------------------------------------------
|| 是或者的意思,只要有一个是 true ,就为 true 。
二维数组的长度:数组名.length ---每个一维数组:数组名[下标].length
&& 两个都是true ,则是true
public class Solution {
public boolean Find(int target, int [][] array) {
if(array == null || array.length == 0 || array[0].length == 0) //考察边界,二维数组为null,长宽都是 0 ,返回 false
return false;
int rows = array.length,cols = array[0].length; //rows cols 是长,高。
int r = 0,c = cols - 1;//右上角开始
while(r<=rows-1 && c >=0){ //如果r<二维数组的长,c > 0 ,一直循环
if(target == array[r][c])
return true;
else if(target > array[r][c])
r++;
else
c--;
}
return false;
}
}