題目:在一個二維數組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。
解題思路:從二維數組的右上角的元素開始判斷,因為此元素是它所在行的最大數,是它所在的列的最小數。如果它等於要查找的數字,則查找過程結束。如果它大於要查找的數字,則可以排除它所在的列。如果它小於要查找的數字,則可排除它所在的行。這樣如果要查找的數字不在數組的右上角,則每次判斷都可以排除一行或一列以縮小查找范圍,直到找到要查找的數字,或者查找范圍為空。
下圖是在二維數組中查找7的示意圖:
參考代碼:
// 二維數組matrix // 每一行都從左到右遞增排序 // 每一列都從上到下遞增排序 bool Find(int *matrix, int rows, int columns, int number) { 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》