二維「有序」陣列查詢問題的解決

2021-09-08 14:58:26 字數 2666 閱讀 5173

題目:在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,誒一列都按照從上到下遞增的順序排序,請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否包含了該整數。

例如下面的二維陣列就是每行、沒列都遞增排序。如果在這個陣列中查詢數字7,則返回true(找得到);如果查詢數字5,由於陣列不含該數字,則返回false。 1

2892

49124

710136

81115

如下圖所示,會出現三種情況

陣列中選取的數字(圖中全黑的位置)剛好是要查詢的數字(相等),查詢過程結束;

選取的數字小於要查詢的數字,那麼根據陣列排序的規則,要查詢的數字應該在當前位置的右邊或者下邊(如下圖2.1(a)所示)

選取的數字大於要查詢的數字,那麼要查詢的數字應該在當前選取的位置的上邊或者左邊。

分析:

由上圖可知,當不等於要查詢的數字的時候會出現兩片要查詢的區域重疊的情況。我們該怎麼考慮呢?                 

我們可以從陣列的乙個角上選取數字來和要查詢的數字做比較,情況會變得簡單一些。如:首先選取陣列右上角的數字9。由於9大於7,並且還是第4列的第乙個(也是最小的)的數字,因此7不可能出現在數字9所在的列。於是我們把這一列從需要考慮的區域內剔除,之後只需分析剩下的3列(如下圖(a)所示)。在剩下的矩陣中,位於右上角的數字是8,同樣8大於7,因此8所在的列我們也可以剔除。接下來我們只要分析剩下的兩列即可(如下圖(b) 所示)。

在由剩下的兩列組成的陣列中,數字2位於數字的右上角。2小於7,那麼要查詢的7可能在2的右邊,也有可能在2的下邊。在前面的步驟中,我們已經發現2右邊的列都已經被剔除了每頁就是說7不可能出現在2的右邊,因此7只有可能出現在2的下邊。於是我們把數字2所在的行也剔除,值分析剩下的三行兩列陣列(如下圖(c)所示)。在剩下的數字中4位於右上角,和前面一樣,我們把數字4所在的行也剔除,最後剩下兩行兩列數字(如圖(d)所示)

在剩下的兩行兩列4個數字中,位於右上角的剛好就是我們要查詢的數字7,於是查詢過程就可以結束了。 1

2892

49124

710136

81115(a)

128924

91247

101368

1115

(b)

1289

24912

47101368

1115

(c) 12

8924

91247

101368

1115

(d)

總結

總結上述查詢的過程,我們發現如下規律:首先選取陣列中右上角的數字。如果該數字等於要查詢的數字,查詢過程結束;如果該數字大於要查詢的數字,剔除這個數字所在;如果該數字小於要查詢的數字,剔除這個數字所在的

編碼實現

核心演算法:

/**

* *

@param

num 被查詢的二維陣列

* @param

rows 行數

* @param

columns 列數

* @param

number 要查詢的數字

* @return

是否找到要查詢的數字(number)

*/public

static boolean find(int num,int rows,int columns,int

number)

else

if(num[row][column] >number)

else

}}

return

found;

}

測試:

public

static

void

main(string args)

,,,};

system.out.println(find(num,4,4,7)); //

在陣列中

system.out.println(find(num,4,4,5)); //

5不在陣列中

}

結果:

true

false

二維有序陣列的查詢 python解決

一點一點的進步 題目是 在 在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列 和乙個整數,判斷陣列中是否含有該整數。解題的思路 菜菜的我想的自然是暴力遍歷,當然那是不行的。看下面大神的思路,恍然大悟。首先選取陣列右上角的...

二維有序陣列查詢某值

該類陣列查詢的要點是找到起點,若如上所示是各行各列遞增,那麼可選取右上角頂點為起點,效果為 當搜尋值 稱為num 不等於該頂點值 稱為point 時,搜尋範圍可一致減小 所謂一致減小,就是範圍減小後符合同一規律 在該例中,由於遞增 若 num point,可確定該點所在行均不符合要求,可將該poin...

有序二維陣列的查詢

劍指offer原題,陣列從左到右,從上到下遞增,給定乙個數target找出這個數是否在該有序二維陣列裡面。找到的話返true,否則返回false。題目比較簡單就簡單說說思路,利用二維陣列的特性,我們把陣列看做乙個矩陣,從矩陣的右上角元素a i,j 開始找,如果a i,j target,則target...