劍指Offer之有序陣列查詢

2021-10-21 06:03:52 字數 1910 閱讀 5361

在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。

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  8

2  4  9

4  7  10

6  8  11

b) 8大於7所以將第三列排除掉,查詢範圍如下:

1  2 

2  4 

4  7 

6  8 

c) 2小於7所以將第一行排除掉,查詢範圍如下

2  4 

4  7 

6  8 

d) 4小於7所以將第二行排除掉,查詢範圍如下:

4  7 

6  8 

這樣就找了數字7。

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...