給定一個二維數組,其每一行從左到右遞增排序,從上到下也是遞增排序。給定一個數,判斷這個數是否在該二維數組中。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; } }
測試用例:
最值考察
二維數組中無該數字
空指針