關於二維有序陣列中搜尋,其題目如下:
給定乙個矩陣,都是整數,每一行從左到右公升序,每一列從上到下有序,例如下面的矩陣
[請用最快的時間找出特定的數,例如,輸入3,存在這個數,輸入15,不存在這個數。[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
實現如下的函式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...