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;
}
posted @ 2021-10-25 19:43  Corline  阅读(35)  评论(0)    收藏  举报