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
    }
};
相关推荐
张张努力变强17 分钟前
C++ STL string 类:常用接口 + auto + 范围 for全攻略,字符串操作效率拉满
开发语言·数据结构·c++·算法·stl
万岳科技系统开发17 分钟前
食堂采购系统源码库存扣减算法与并发控制实现详解
java·前端·数据库·算法
池央21 分钟前
ops-nn 算子库中的数据布局与混合精度策略:卷积、矩阵乘法与 RNN 的优化实践
rnn·线性代数·矩阵
张登杰踩23 分钟前
MCR ALS 多元曲线分辨算法详解
算法
YuTaoShao32 分钟前
【LeetCode 每日一题】3634. 使数组平衡的最少移除数目——(解法一)排序+滑动窗口
算法·leetcode·排序算法
波波00739 分钟前
每日一题:.NET 的 GC是如何分代工作的?
算法·.net·gc
风暴之零1 小时前
变点检测算法PELT
算法
深鱼~1 小时前
视觉算法性能翻倍:ops-cv经典算子的昇腾适配指南
算法·cann
李斯啦果1 小时前
【PTA】L1-019 谁先倒
数据结构·算法
梵刹古音1 小时前
【C语言】 指针基础与定义
c语言·开发语言·算法