LeetCode 240. 搜索二维矩阵 II
LeetCode 240. 搜索二维矩阵 II
编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:
- 每行的元素从左到右升序排列。
- 每列的元素从上到下升序排列。
输入: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]], target = 5
输出:true
bool searchMatrix(vector<vector<int>>& matrix, int target)
解析:
很朴素的思想是从左上或者右下开始,依次遍历,如果相等就返回true。
但是因为从左向右,从上至下数据是升序的,所以可以做一定的剪枝优化。
这里以从上至下遍历为例,即行从0 - 4,接下来的步骤就比较关键了,朴素思想里面,列是从左到右遍历的,但列下标从右到做递减才好做优化。
例如,行标i = 0, 列标 j = 4。matrix[i] [j] = 15 > target j--
当 j = 1, matrix[i] [j] = 4 < target 这时 i++,来到第二行 i = 1, j = 1。
**答案target必不可能在(i, j)的右下方和左上方。只可能在当前位置的左侧或左下方. **
如果target在右下方,那么 j 在递减到当前值过程中,一定有一个位置的值比target小,那时i++,就不能来到当前位置。
target也不可能在左上方。因为左上方的值全部小于当前值。当前值是小于target的,故左上方的值小于target。
bool searchMatrix(vector<vector<int>>& matrix, int target)
{
int N = matrix.size();
int M = matrix[0].size();
int i = N - 1, j = 0;
while(i >= 0 && j < M)
{
if(matrix[i][j] > target) i--;
else if(matrix[i][j] == target) return true;
else j++;
}
return false;
}