有序二維陣列中搜尋特定的數

2021-06-24 11:09:30 字數 1454 閱讀 4272

關於二維有序陣列中搜尋,其題目如下:

給定乙個矩陣,都是整數,每一行從左到右公升序,每一列從上到下有序,例如下面的矩陣

[

[1, 3, 5, 7],

[10, 11, 16, 20],

[23, 30, 34, 50]

]

請用最快的時間找出特定的數,例如,輸入3,存在這個數,輸入15,不存在這個數。

實現如下的函式bool findarray(int *parray,int nwidth,int nheight,int nkey)。

最笨的方法是逐個遍歷進行比較,如果是這樣,這題目就沒什麼意義了。觀察這個陣列,可以先從第一行的最後乙個元素開始,這個元素所在的列,在7這個元素下面的都比他大,這個元素所在的列,在他左邊的都比他小。那麼我們就可以這樣比較,首先,取出第一行最右邊的元素,和關鍵字比較,如果關鍵字正好和他相等,那麼就找到了,如果這個元素比關鍵字小,那麼要查詢的關鍵字必然在這一行的下面或者不存在,所以,就定位到這個元素的下面一行對應的元素,即第二行最後一列;如果這個元素比關鍵字大,那麼關鍵字必然在這個元素所在列的左邊,那麼就定位到這個元素的左邊,即第一行倒數第二個元素,如此,搜尋完整個陣列就可以找到結果。既然思路已經清楚了,那麼**也就很容易寫出來:

bool findarray(int *parray,int nwidth,int nheight,int nkey)

//從右上角開始搜尋

int ncol = nwidth - 1;

int nrow = 0;

bool bfound = false;

while (ncol >= 0 && nrow <= nheight-1)

else if (parray[nrow*nwidth+ncol] < nkey)

else

}return bfound;

}

其實,還有另外一種方法,就是最先比較第一列最後一行的要素,其比較規則和上面的類似,不再陳述,在此也給出**:

bool findarrayex(int *parray,int nwidth,int nheight,int nkey)

//從坐下角開始搜尋

int ncol = 0;

int nrow = nheight - 1;

bool bfound = false;

while (ncol < nwidth && nrow >= 0)

else if (parray[nrow*nwidth+ncol] < nkey)

else

}return bfound;

}

測試**如下:

void main()

;int b = ;

printf("%d\n",findarrayex(b,4,3,3));

}如果有更好的方法也請交流,此題目在leetcode的位址是

有序二維陣列中查詢

題目 在乙個n n二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。舉例1 2342 3473 4784 589 找6,false 找5,true 分析 找6,從右上角開始 也可以左下角 右...

二維陣列中查詢特定的值

題目描述 在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。示例 1 2 3 4 5 6 7 8 9 10 11 12 思路 因為陣列是從左到右,從上到下依次遞...

有序二維陣列的查詢

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