二維陣列中的查詢 之 二分法

2021-09-01 00:27:04 字數 1278 閱讀 6451

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

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

例如下面的二維陣列就是每行、每列都遞增排序。如果在這個陣列中查詢數字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 ( i

left_result = binsearch(value, a, n, i+1, begin_n1, end_m2, j);

if ( j

right_result = binsearch(value, a, n, begin_m1, j+1, i, end_n2);

if (left_result | right_result )

return 1;

else

return 0;

}

2014 8 25二分法,二維陣列

1 二分法2 假設頂乙個已經排好序的陣列,使用者輸入乙個數,找出這個數的位置,沒有則返回空 3int nums new int 10 4int a 0,b nums.length 1 zj 5 console.writeline 請輸入要查詢的數 6int n convert.toint32 con...

二維陣列中的元素查詢(二分法的運用)

1 vector知識 參考這篇博文,寫得不錯 2 用vector來表示二維陣列 vectorarray 3 定義了行數為3列數不定的二維陣列 array.size 返回二維陣列的行數 array 0 size 返回二維陣列第一行的列數 定義乙個行列固定的二維vector陣列 例 vectorint ...

陣列中的二分法查詢

二分法查詢 第一 二分法中查詢建立在排序的基礎之上。第二 二分法查詢效率要高於 乙個挨著乙個 的這種查詢方式。第三 二分查詢法原理?10 0下標 23 56 89 100 111 222 235 500 600 目標 找出600下標 0 9 2 4 中間元素的下標 arr 4 這個元素就是中間元素 ...