题目:在一个二维数组中,每一行都按照从左到右递增的顺序,每一列都按照从上到下递增的顺序排序,完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否有该函数。
如二维数组:
1 | 2 | 8 | 9 |
2 | 4 | 9 | 12 |
4 | 7 | 10 | 13 |
6 | 8 | 11 | 15 |
查找数字7,存在返回true;查找数字5,不存在,返回false;
处理方法:
从最右上角的数字开始,如果查找数小于该数,则查找数一定位于该数左侧,排除该列,继续查找左侧剩下的矩阵;
如果查找数大于该数,则查找数一定位于该数下侧,排除该行,继续查找下侧剩下的矩阵,以此类推继续从剩下矩阵的右上角数字开始查找;
如果查找数字等于该数,则返回true;
如果已无矩阵剩下且仍未找到,则返回false。
代码:
bool Find(int *matrix, int rows, int columns, int number) { bool found = false; int row = 0, column = columns-1; if (matrix != NULL && rows > 0 &&columns >0) { 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; }
完整测试代码:
#include <iostream> #include <stdio.h> using namespace std; bool Find(int *matrix, int rows, int columns, int number) { bool found = false; int row = 0, column = columns-1; if (matrix != NULL && rows > 0 &&columns >0) { while(row < rows && column >=0) { if(matrix[row*columns+column] == number) { found = true; break; } else if (matrix[row*columns+column] > number) { --column; } else { ++row; } } } if(found) cout << "The number found in row: " << row+1 <<", column: " << column+1 << '.' << endl; else cout << "The number is not found." << endl; cout << "------------------------------" << endl; return found; } void Test(int* matrix, int rows, int columns, int number) { cout << "-------The input matrix is: ------" << endl; for(int r = 0; r< rows; r++) { for(int c = 0; c < columns; c++) { if(r==rows) break; cout << matrix[r*columns+c] << ' '; if(c==columns-1) { c = -1; ++r; cout << endl; } } } cout << endl << "The number to find: " << number << '.' << endl; Find(matrix, rows, columns, number); } int main() { int matrix[][4] = {{1, 2, 8, 9}, {2, 4, 9, 12}, {4, 7, 10, 13}, {6, 8, 11, 15}}; Test((int*)matrix, 4, 4, 7); Test((int*)matrix, 4, 4, 5); Test((int*)matrix, 4, 4, 1); Test((int*)matrix, 4, 4, 15); Test((int*)matrix, 4, 4, 0); Test((int*)matrix, 4, 4, 16); Test((int*)matrix, 0, 0, 16); return 0; }
参考资料:《剑指offer名企面试官精讲典型编程题》