二維陣列查詢

2021-06-02 02:31:12 字數 1083 閱讀 9511

近日微博上看到乙個題目,二維陣列查詢

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

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

例如下面的二維陣列就是每行、每列都遞增排序。如果在這個陣列中查詢數字7,則返回true;

如果查詢數字5,由於陣列不含有該數字,則返回false。

我的解題思路是這樣的矩陣行列都是從小到大排好序的,要查詢的話自然用二分效率比較高,

而且這樣的矩陣有個性質,最左上角的元素必定是最小值,最右下角的是最大值,在乙個

n*n的矩陣中,對角線的元素也是排好序的,找到對角線上的乙個元素,使得這個元素小於

待查詢的key,並且下一元素大於待查詢的key,那麼只要在這個元素的左下角矩陣和右上角

矩陣遞迴繼續對角線查詢就可以了,例如上圖例子裡查詢7,只要找到對角線的元素4,然後

遞迴查詢紅圈的矩陣就可以了

矩陣最小值10>7,無需查詢了,但是此題並沒有告訴我們原始矩陣是n*n的,這是比較麻煩的

地方,不過思路是一樣的,無非不能用對角線查詢這樣簡單的辦法了,假設m*n的矩陣,對角線

查詢的辦法改進為i = (m1+m2)/2,j = (n1+n2)/2 進行查詢就可以了,(m1,n1)為矩陣最左上角

元素下標,(m2,n2)為最右下角元素下標

假設查詢17,第一次比較10,然後比較25,然後比較13,返回元素13,這時候再遞迴查詢13

左下角的矩陣和右上角的矩陣就可以了(紅色橢圓部分);如果是查詢9,第一次比較10,然後比較4,

然後比較6,返回元素6,這時候遞迴查詢6左下角的矩陣和右上角矩陣(綠色橢圓部分)

**如下:

a是二維陣列首位址,(m1, n1)左上角座標,(m2, n2)右下角座標,引數n是矩陣一行的元素個數

int binsearch(int value, int *a, int n, int m1, int n1, int m2, int n2)

else }

//search left & right

if ( ielse

return 0; }

@exp_88。

二維陣列查詢

天氣變化大,生病折騰了1個禮拜,寫篇部落格壓壓驚。題目源自於清明假期前夕舍友春招的筆試題,後來得知是劍指offer上的一道題,書上應該有解題思路啥的。題目重述 在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,...

二維陣列查詢

題目描述 在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請 完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。解題思路 按照一般搜尋二維陣列的方法,從左到右,從上到下,比較難根據這個陣列的特點進行快速搜尋。可以從 右到左,從上到下,...

二維陣列查詢

題目 在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。解題思路 從二維陣列的右上角的元素開始判斷,因為此元素是它所在行的最大數,是它所在的列的最小數。如果它等於要查詢的數字,則查詢過...