剑指offer 面试题 二维数组中的查找
分析:
如果矩阵右上角的值比target大,删除所在的列,列号-1,在剩下的元素中继续找;如果矩阵右上角的值不大于target,删除所在的行,行号+1,在剩下的元素中继续找,找到相等的元素就退出.
由于在线oj给的C++版输入是向量,故不能直接使用C语言风格的二维数组展开为一维的方法。
AC代码:
#include <iostream> #include <vector> using namespace std; class Solution { public: bool Find(vector<vector<int> > array, int target) { int rows=array.size(); // 行数 int cols=array[0].size(); // 列数 int i=0, j=cols-1; bool found = false; while(j>=0 && j<cols && i<rows) // i>=0 默认满足,无须再判断 { if(array[i][j] == target) { found = true; break; } else if(array[i][j] > target) j--; // 如果矩阵右上角的值比target大,删除所在的列,列号-1 else i++; // 如果矩阵右上角的值不大于target,删除所在的行,行号+1 } return found; } }; // 以下为测试部分 /* int main() { Solution sol; int i,j; vector<vector<int> > arr(5, vector<int>(3)); for (i = 0; i < arr.size(); i++) for (j = 0; j < arr[0].size(); j++) arr[i][j] = 2*i*j; cout<<sol.Find(arr,4)<<endl; vector<vector<int> > matrix = { {1,4,7,11,15}, {2,5,8,12,19}, {3,6,9,16,22}, {10,13,14,17,24}, {18,21,23,26,30} }; int target = 30; cout<<sol.Find(matrix,target)<<endl; return 0; } */