二維數(shù)組中的查找

題目描述

在一個(gè)二維數(shù)組中(每個(gè)一維數(shù)組的長(zhǎng)度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請(qǐng)完成一個(gè)函數(shù),輸入這樣的一個(gè)二維數(shù)組和一個(gè)整數(shù),判斷數(shù)組中是否含有該整數(shù)。

例子

輸入一個(gè)數(shù)組:

num[ 3 ][ 4 ] = [  
1 , 4 , 6 , 28 ,  
2 , 7 , 32 , 30 ,  
10 , 11 , 67 , 79  
]

需要查找一個(gè)數(shù)字32,則返回 true。

思路以及解答

暴力破解

直接暴力遍歷,但是在最壞的情況是遍歷完所有的元素才能獲取結(jié)果。如果這個(gè)數(shù)組規(guī)模是 n * m,那么時(shí)間復(fù)雜度就是 O(n × m),沒(méi)有借助其他的空間,空間復(fù)雜度為 O(1)。

比較查找法

但是我們換一種思路,我們選定左下角的10 ( num[2][0], i = 2, j = 0 )作為起點(diǎn),如果大于10 ,那么 i + 1 ,如果小于 10 ,則 j + 1 ,則下一個(gè)查找的數(shù)字是 11 ,我們知道 32 仍然比 11 大,則往右找到 67 ,繼而 32 比 67 小,我們應(yīng)該往上找,找到了 32 。
如果找 28 ,則是最壞的結(jié)果,查找知道數(shù)組的右上角結(jié)束,這樣一來(lái),最壞的結(jié)果就是 O(n+m)。

代碼

public class Solution {
    public boolean Find(int target, int[][] array) {
        int size = array.length;
        if (size == 0) return false;
        int length = array[0].length;
        if (length == 0) return false;

        int i = size - 1, j = 0; // 從左下角開(kāi)始
        while (i >= 0 && j < length) {
            if (array[i][j] == target) {
                return true;
            } else if (array[i][j] < target) {
                j++; // 向右移動(dòng)
            } else {
                i--; // 向上移動(dòng)
            }
        }
        return false;
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容