在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。
1 2 8 9如題所示,它的行和列都是遞增的。那麼我們需要試圖找到邊界點,這個邊界點可以幫助我們排除一整行或一整列。2 4 9 12
4 7 10 13
6 8 11 15
看左上角的1,比1大的可以是第一列和第一行,所以很難排除一整行或一整列。那麼綜上,我們可以選取左下角或右上角作為第乙個判斷邊界,依次排除掉整列或整行,這樣逐步減少查詢範圍,最終找到我們需要的數字。看左下角的6,比6大的數可以確定不在第一列,這樣就可以把第一列排除掉。比6小的數,可以確定不在最後一行,可以把第四行排除掉。所以這個邊界點滿足條件。
看右下角15,比15小的可以是第四行和第四列,無法排除掉。
看右上角9,同樣的,比9大的可以排除第一行,比9小的可以排除第四列。
以查詢數字7為例子,它的演變過程如下:
a)9大於7所以將第四列排除掉,查詢範圍如下:
1 2 8b) 8大於7所以將第三列排除掉,查詢範圍如下:2 4 9
4 7 10
6 8 11
1 2c) 2小於7所以將第一行排除掉,查詢範圍如下:2 4
4 7
6 8
2 4d) 4小於7所以將第二行排除掉,查詢範圍如下:4 7
6 8
4 7這樣就找了數字7。6 8
bool find(int* pmatrix, int nrows, int ncolumns, int nnumber)
//first compare right corner
bool bfind = false;
int ncurrow = 0;
int ncurcolumn = ncolumns - 1;
while (ncurrow < nrows && ncurrow >=0)
if (pmatrix[ncurindex] < nnumber)
if (pmatrix[ncurindex] == nnumber)
} return bfind;
}
如上二維數字其實是乙個一維陣列,在記憶體上是連續的。所以這裡通過計算索引獲取陣列中的數字位置進行判斷。**比較簡單這裡就不過多贅述了。
對**進行測試如下:
void testfindmatrix() ;
int nnumber = 33;
bool bfind = find(matrix, 4, 5, nnumber);
std::string strresult = (bfind == true ? "successful" : "failed");
printf("find %s: %d\n", strresult.c_str(), nnumber);
}
執行結果:
33確實不在陣列內,所以查詢失敗。
劍指offer 合併有序陣列 04 1
include include 有兩個排序的陣列a1和a2,內存在a1的末尾有足夠多的剩餘空間容納a2 實現乙個函式將a2中所有的數字插入到a1,並寫所有的數字是排序的。自己寫的,用例不多,還需進一步測試 void merge int array1,int array2,int length,int...
劍指offer 查詢二維有序陣列中是否含有某整數
二維陣列轉化成指標 int matrix 4 其中matrix 4 和 int matrix等價 bool isture sol.findtwodimention int matrix,4,4,70 面試題4 二維陣列中的查詢 題目 在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按 ...
劍指offer 陣列查詢
在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。方法一 暴力查詢 不考慮二維陣列的有序性,兩重迴圈直接遍歷。public class solution ret...