给定一个二维数组,其每一行从左到右递增排序,从上到下也是递增排序。给定一个数,判断这个数是否在该二维数组中。java
解题思路数组
要求时间复杂度 O(M + N),空间复杂度 O(1)。测试
特性:该二维数组中的一个数,它左边的数都比它小,下边的数都比它大。指针
利用二维数组由上到下,由左到右递增的规律,
code
那么选取右上角或者左下角的元素a[row][col]与target进行比较,
blog
当target小于元素a[row][col]时,那么target一定在元素a所在行的左边,
排序
即col--;
get
当target大于元素a[row][col]时,那么target一定在元素a所在列的下边,
io
即row++;
class
所以,从右上角开始查找,就能够根据 目标和当前元素的大小关系来缩小查找区间。
1. 若是数字 = 须要查找的数字,则查找过程结束。
2. 该位置的数字 < 须要查找的数字,须要向下 or 向右查找(不须要了)。
3. 该位置的数字 > 须要查找的数字,须要向左 or 向上查找(不须要,由于是右上角)
------------------------------------------------------------------------------------------------------------------------------------------------
|| 是或者的意思,只要有一个是 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]) //当target大于元素a[row][col]时,那么target一定在元素a所在列的下边,即row++; r++; else //当target小于元素a[row][col]时,那么target一定在元素a所在行的左边,即col--; c--; } return false; } }
测试用例:
最值考察
二维数组中无该数字
空指针