{面试题3: 二维数组中的查找 }
From 剑指Offer 何海涛 著
// 从右上角开始查找 bool find(const int *matrix, int rows, int columns, int value) { if(matrix == NULL || rows <= 0 || columns <= 0 || value < *matrix || *(matrix+rows*columns-1) < value) { return false; } int row = 0; int column = columns-1; while(row < rows && column >= 0) { int curr = *(matrix+row*columns+column); if(curr == value) { return true; } if(curr < value) { row++; } else { column--; } } return false; }
// 从左下角开始查找
bool find(const int *matrix, int rows, int columns, int value) { bool found = false; if(matrix != NULL && rows > 0 && columns > 0 && *matrix <= value && value <= *(matrix+rows*columns-1)) { int row = rows-1; int column = 0; while(row >=0 && column < columns) { int curr = *(matrix+row*columns+column); if(curr == value) { found = true; break; } if(curr < value) { column++; } else { row--; } } } return found; }
测试集:
void test(const int *matrix, int rows, int columns, int value, bool expected) { std::cout << std::boolalpha << (find(matrix, rows, columns, value) == expected) << std::endl; } int main(int argc, char* argv[]) { // 1 2 8 9 // 2 4 9 12 // 4 7 10 13 // 6 8 11 15 int matrix[][4] = {{1, 2, 8, 9}, {2, 4, 9, 12}, {4, 7, 10, 13}, {6, 8, 11, 15}}; test(NULL, 4, 4, 7, false); test(*matrix, 0, 4, 7, false); test(*matrix, 2, 4, 7, false); test(*matrix, 4, 4, 7, true); test(*matrix, 4, 4, 5, false); test(*matrix, 4, 4, 1, true); test(*matrix, 4, 4, 15, true); test(*matrix, 4, 4, 0, false); test(*matrix, 4, 4, 16, false); return 0; }
注意: 列数必须是原矩阵的列数, 否则将破坏原矩阵中元素出现的规律: 同一行上元素呈递增趋势; 同一列上元素呈递增趋势!
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。