題目:
在一個二維數組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。面試
須要與面試官確認的是,這個二維數組的元素是否存在重複狀況,如何處理重複狀況。數組
解題思路:
1.判斷待查找整數與矩陣的左上角的最小元素以及右下角的最大元素,若是沒在他們之間則直接返回沒有找到。函數
2.選取數組中右上角的數字,若是該數字等於要查找的數字,則查找過程結束;
3.若是該數字大於要查找的數字,則剔除這個數字所在的列;
4.若是該數字小於要查找的數字,則剔除這個數字所在的行。code
也就是說:若是要查找的數字不在數組的右上角,則每一次都在數組的查找範圍中剔除一列或者一行,這樣每一步均可以縮小查找的範圍,直到找到要查找的數字或者查找範圍爲空。排序
bool Find(int *matrix, int rows, int columns, int number) { if(number < matrix[0][0] || number > matrix[rows-1][columns-1] ) return false; else { bool found = false; if(matrix != NULL && rows > 0 && columns > 0) { int row = 0; int column = columns-1; while(row < rows && column >= 0) { if(matrix[row*columns+column] == number) { found = true; break; } else if (matrix[row*columns + column] > number) -- column; else ++ row; } } } return found; }
參考:《劍指Offer》class