04 二維陣列中查詢

2021-10-13 07:31:28 字數 1654 閱讀 5520

在乙個 n * m 的二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個高效的函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。

示例:

[

[1, 4, 7, 11, 15],

[2, 5, 8, 12, 19],

[3, 6, 9, 16, 22],

[10, 13, 14, 17, 24],

[18, 21, 23, 26, 30]

]

給定 target = 5,返回 true。

給定 target = 20,返回 false。

錯誤思路:一開始是想到元素從下標為(0,0)開始遍歷,先以[0][j](n>=j>=0)遍歷,記錄第乙個出現大於target的j,然後如果有target會出現在第j-1列。再以[i][0](m>=i>=0)遍歷,記錄第乙個出現大於target的i,然後如果有target會出現在第i-1行。接下來只用尋找第j-1列元素和i-1行元素就行。但是事實上這樣做漏掉了很多情況,例如j-1的前一列,和i-1的前一行。

如下:

[[1,3,5,7,9],

[2,4,6,8,10],

[11,13,15,17,19]

,[12,14,16,18,20],

[21,22,23,24,25]]

target=13

如果按照我的方案,會出現i=4,j=4 ,但是在第五行和第五列沒有找到這個13,二是出現在了3行2列,所有這個方法是有問題的。

如果把陣列旋轉逆時針45度,以下標元素(0,n)為根節點,往左變小往右變大,我們可以類似於理解為2叉搜尋樹

**這個題型的解法是一定要注意最開始元素的位置。**找到它就容易很多。

#include

#include

using

namespace std;

intmain()

int value =

0,target=5;

bool flag=

false

;for

(int i=

0;isize()

;i++)}

int len=

0,wei=matrix[0]

.size()

-1;while

(len

size()

&&wei>=0)

else

if(matrix[len]

[wei]

else

} cout<

return0;

}

這道題還有其他的解題思路:例如,二分查詢和遞迴方法,之後補充

[ ] 形狀為(0,) m.size()為0,直接false,因為不存在target

形狀為(1,0) m.size() 為1 但沒有資料 不存在資料直接為false

[[1]] 形狀為(1,1)

[[1,1]] 形狀為1,2

04 二維陣列中的查詢

給定乙個二維陣列,其每一行從左到右遞增排序,從上到下也是遞增排序。給定乙個數,判斷這個數是否在該二維陣列中。consider the following matrix 1,4,7,11,15 2,5,8,12,19 3,6,9,16,22 10,13,14,17,24 18,21,23,26,30 ...

04 二維陣列中的查詢

題目 在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。public class testmethod system.out.println method ar...

04 二維陣列中的查詢

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