劍指offer面試題3 二維陣列查詢問題

2021-08-15 05:56:11 字數 1440 閱讀 6079

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

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

暴力破解方式也就是對二維陣列中的每個元素逐個檢查,結束條件為找到和目標值相等的元素或者查詢到最後乙個元素。

對於乙個行列數都為n的二維陣列而言,最壞的情況是將整個陣列遍歷完,這種情況下時間複雜度為o(n^2),並不是乙個好的解決方法。

假設,有乙個5*5的二維陣列,待查詢元素為18,陣列如下圖所示:

視整個陣列為待查詢區域,對於陣列右上角(即行1列5)的元素20,我們可以有以下結論:

因此對於任意待查詢元素,可以知道:

如果待查詢元素和當前元素(即20)相等,則陣列中包含待查詢元素,查詢結束。

如果待查詢元素小於當前元素(即20),則下一步中待查詢區域變為圖中黃色部分加灰色部分。

如果待查詢元素大於當前元素(即20),則下一步中待查詢區域變為圖中藍色部分加灰色部分。

詳細步驟為:

總體思路為:每次取待查詢區域右上角元素,然後將待查詢區域分為兩部分,即新的待查詢區域和大於(或小於)當前元素區域。然後一直重複上述操作,直到找到待查詢元素或左下角元素。

同樣,也可以每次選取待查詢區域左下角的元素,然後根據相應規則確定新的待查詢區域,此處就不再詳細說明。

每次從待查詢區域中選取右上角元素寫法:

public

boolean

find(int target, int array)

int rowlength = array.length;

int collength = array[0].length;

boolean find = false;

for(int col=collength-1, row=0; col>=0 && rowint num = array[row][col];

if(num == target) else

if (numelse

}return find;

}

每次從待查詢區域中選取左下角元素寫法:

public

boolean

find(int target, int array)

int rowlength = array.length;

int collength = array[0].length;

boolean find = false;

for(int col=0, row=rowlength-1; col=0;) else

if (num < target) else

}return find;

}

劍指offer 面試題3 二維陣列的查詢

題目 在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。class solution else if array row col target col else row return ...

劍指offer面試題 二維陣列的查詢

思路 當我們看到這道題的第一反應應該是遍歷這個二維陣列,逐個進行查詢,這樣雖然可以得到結果但是時間複雜度較大,並且沒有用到題目中給我們的線索,我們可以看到該二維數字是按照一定順序排列的。我們可以把這個四行四列的二維陣列看做乙個4 4的方格,先找出右上角的數字,如果右上角的數字是我們要找的數字就結束,...

劍指offer 面試題04 二維陣列查詢

二維陣列查詢 在乙個 n m 的二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。示例 現有矩陣 matrix 如下 1,4,7,11,15 2,5,8,12,19 3,6,9,16,22 ...