LeetCode 热门100题-搜索二维矩阵 II

题目描述:

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

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

示例 1:

复制代码
输入: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

逻辑:(人家说的好,用人家的)

若使用暴力法遍历矩阵 matrix ,则时间复杂度为 O(NM) 。暴力法未利用矩阵 "从上到下递增、从左到右递增" 的特点,显然不是最优解法。

如下图所示,我们将矩阵逆时针旋转 45° ,并将其转化为图形式,发现其类似于 二叉搜索树 ,即对于每个元素,其左分支元素更小、右分支元素更大。因此,通过从 "根节点" 开始搜索,遇到比 target 大的元素就向左,反之向右,即可找到目标值 target 。

"根节点" 对应的是矩阵的 "左下角" 和 "右上角" 元素,本文称之为 标志数 ,以 matrix 中的 左下角元素 为标志数 flag ,则有:

若 flag > target ,则 target 一定在 flag 所在 行的上方 ,即 flag 所在行可被消去。

若 flag < target ,则 target 一定在 flag 所在 列的右方 ,即 flag 所在列可被消去。

算法流程:

从矩阵 matrix 左下角元素(索引设为 (i, j) )开始遍历,并与目标值对比:

当 matrix[i][j] > target 时,执行 i-- ,即消去第 i 行元素。

当 matrix[i][j] < target 时,执行 j++ ,即消去第 j 列元素。

当 matrix[i][j] = target 时,返回 true ,代表找到目标值。

作者:Krahets

链接:https://leetcode.cn/problems/search-a-2d-matrix-ii/solutions/2361487/240-sou-suo-er-wei-ju-zhen-iitan-xin-qin-7mtf/

来源:力扣(LeetCode)


cpp 复制代码
class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        if (matrix.empty() || matrix[0].empty()) {
            return false;  // 如果矩阵为空,直接返回 false
        }
        
        int m = matrix.size();
        int n = matrix[0].size();
        
        // 从右上角开始
        int row = 0;
        int col = n - 1;
        
        while (row < m && col >= 0) {
            if (matrix[row][col] == target) {
                return true;  // 找到目标值,返回 true
            } else if (matrix[row][col] < target) {
                row++;  // 如果当前值小于目标值,向下移动到下一行
            } else {
                col--;  // 如果当前值大于目标值,向左移动到前一列
            }
        }
        
        return false;  // 如果遍历完矩阵后还没找到目标值,返回 false
    }
};
相关推荐
wgc2k14 分钟前
吴恩达深度学习复盘(6)神经网络的矢量化原理
python·深度学习·矩阵
.YY001.16 分钟前
数据结构第一轮复习--第六章图包含代码
数据结构·算法
?Agony28 分钟前
P17_ResNeXt-50
人工智能·pytorch·python·算法
计算机真好丸33 分钟前
第J9周:Inception v3算法实战与解析
算法
HR Zhou1 小时前
群体智能优化算法-算术优化算法(Arithmetic Optimization Algorithm, AOA,含Matlab源代码)
人工智能·算法·数学建模·matlab·优化·智能优化算法
wen__xvn1 小时前
每日一题洛谷P8649 [蓝桥杯 2017 省 B] k 倍区间c++
c++·算法·蓝桥杯
倔强的石头1061 小时前
【C++经典例题】杨辉三角问题
算法
float_六七2 小时前
蓝桥杯——统计子矩阵
职场和发展·矩阵·蓝桥杯
独好紫罗兰2 小时前
洛谷题单3-P4956 [COCI 2017 2018 #6] Davor-python-流程图重构
开发语言·python·算法
ん贤2 小时前
2024第十五届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组
c语言·数据结构·c++·经验分享·笔记·算法·蓝桥杯