题意:在一个m*n的二维矩阵中查找一个目标值。矩阵每一行从左到右升序排列,每一列从上到下升序排列。
例如: [ [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] ]
分析:二维矩阵的右上角元素有特殊性:它左方的元素都比它小,它下方的元素都比它大。利用这个性质,我们可以从右上角开始找,如果目标值比右上角的元素大,就往下找;如果目标值比右上角的元素小,就往左找。这样循环直到找到目标值或者出界。最坏情况是从右上角找到左下角才找到,这样一共判断了m+n次,所以时间复杂度是O(m+n)。
代码:
class Solution { public: bool searchMatrix(vector<vector<int>>& matrix, int target) { int m=matrix.size(),n=matrix[0].size(); int curRow=0,curCol=n-1;//右上角开始 while(curRow>=0&&curRow<m&&curCol>=0&&curCol<n) { if(target>matrix[curRow][curCol])//往下 { curRow++; } else if(target<matrix[curRow][curCol])//往左 { curCol--; } else { return true; } } return false; } };