3.二維數組中的查找 ----《劍指Offer》題解(Java)

題目

在一個二維數組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。算法

請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。數組

樣例
輸入數組:函數

[
[1,2,8,9],
[2,4,9,12],
[4,7,10,13],
[6,8,11,15]]code

若是輸入查找數值爲7,則返回true,排序

若是輸入查找數值爲5,則返回false。get

算法思路

常規思路是直接兩層循環暴搜,但時間複雜度是O(n^2)。
本題能夠利用從左到右,從上到下遞增的性質,從右上角的元素開始(從左下角也行),若是target比該元素小,那麼該元素所在列沒必要再作判斷(整列都比該元素大),若是taget比該元素大,則不用再判斷該元素所在行的其餘元素,也就是每次都能省去判斷整一列或者一行,縮小搜索區域。
時間複雜度是:O(n+m),其中n是行數,m是列數io

代碼實現

class Solution {
    public boolean searchArray(int[][] array, int target) {
        if(array == null || array.length == 0) {
            return false;
        }
        
        if(array[0] == null || array[0].length == 0) {
            return false;
        }
        
        int row = array.length, col = array[0].length;
        int rIdx = 0, cIdx = col - 1;
        while(rIdx < row && cIdx >= 0) {
            int num = array[rIdx][cIdx];
            if(num == target) return true;
            if(num > target) cIdx--;
            else rIdx++;
        }
        return false;
    }
}
相關文章
相關標籤/搜索