近日微博上看到乙個題目,二維陣列查詢
在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。
請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。
例如下面的二維陣列就是每行、每列都遞增排序。如果在這個陣列中查詢數字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上的一道題,書上應該有解題思路啥的。題目重述 在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,...
二維陣列查詢
題目描述 在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請 完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。解題思路 按照一般搜尋二維陣列的方法,從左到右,從上到下,比較難根據這個陣列的特點進行快速搜尋。可以從 右到左,從上到下,...
二維陣列查詢
題目 在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。解題思路 從二維陣列的右上角的元素開始判斷,因為此元素是它所在行的最大數,是它所在的列的最小數。如果它等於要查詢的數字,則查詢過...