1. 二維數組中的查找

給定一個二維數組,其每一行從左到右遞增排序,從上到下也是遞增排序。給定一個數,判斷這個數是否在該二維數組中。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;
    }
}

測試用例:

最值考察

二維數組中無該數字

空指針

相關文章
相關標籤/搜索