玩命加载中 . . .

搜索二维矩阵Ⅱ


描述

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:

每行的元素从左到右升序排列。
每列的元素从上到下升序排列。

示例 1:

img

输入: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
示例 2:

img

输入: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 = 20
输出:false

提示:

m == matrix.length
n == matrix[i].length
1 <= n, m <= 300
-109 <= matrix[i][j] <= 109
每行的所有元素从左到右升序排列
每列的所有元素从上到下升序排列
-109 <= target <= 109

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/search-a-2d-matrix-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解

这个问题的解决方法是从矩阵的右上角开始搜索,如果当前元素等于目标元素,则返回true。如果当前元素大于目标元素,则向左移动一列;如果当前元素小于目标元素,则向下移动一行。由于矩阵的行和列都是按照升序排列的,因此这种搜索方法可以快速地找到目标元素,时间复杂度为O(m+n)。

C++代码

class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        int m = matrix.size();
        if (m == 0) return false; // 如果矩阵为空,则返回false
        int n = matrix[0].size();
        int row = 0, col = n - 1; // 从矩阵右上角开始搜索
        while (row < m && col >= 0) { // 只要row和col的值在矩阵范围内,就继续搜索
            if (matrix[row][col] == target) { // 如果找到目标元素,则返回true
                return true;
            } else if (matrix[row][col] > target) { // 如果当前元素大于目标元素,则向左移动一列
                col--;
            } else { // 如果当前元素小于目标元素,则向下移动一行
                row++;
            }
        }
        return false; // 如果搜索完整个矩阵都没有找到目标元素,则返回false
    }
};

文章作者: Jack Tim
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Jack Tim !
评论
  目录