方法:线性搜索
通过观察二维数组可以发现,左下角的元素是所在列最大的值,是所在行最小的值;右上角的元素是所在列最小的值,是所在行最大的值。如果从左下角或者右上角进行搜索,则一次搜索可以排除一行或者一列的元素。下列以右上角进行搜索:
时间复杂度:0(n+m)
空间复杂度:o(1)
class Solution { public: bool Find(int target, vector<vector<int> >& array) { int col = array.size(); int row = array[0].size(); //特殊情况处理 if (col == 0 || row == 0) return false; int n = 0; int m = row - 1; while (n < col && m >= 0) { //从右上角开始搜索 if (array[n][m] == target) return true; //小于右上角元素的,排除所在列的元素 else if (target < array[n][m]) m--; //大于右上角元素的,排除所在行的元素 else n++; } return false; } };