leetcode 74搜索二维矩阵

复制代码
class Solution {
public:
    bool searchMatrix(vector<vector<int>> matrix, int target) {

        // 1. 找到第一个"行首元素 > target"的行
        auto row = upper_bound(
            matrix.begin(),
            matrix.end(),
            target,
            [](const int target, const vector<int>& currentRow) {
                return target < currentRow[0];
            }
        );

        // 如果第一行的行首元素就已经 > target
        // 说明 target 比矩阵最小元素还小,不可能存在
        if (row == matrix.begin()) {
            return false;
        }

        // 2. 回退一行
        // 这一行才是 target 可能存在的行
        --row;

        // 3. 在这一行中使用二分查找 target
        return binary_search(row->begin(), row->end(), target);
    }
};

这道题的思路可以总结为:

先利用每一行的第一个元素进行二分:

复制代码
找第一个:
行首元素 > target

比如:

复制代码
1   3   5   7
10  11  16  20
23  30  34  60

target = 16

行首元素是:

复制代码
1   10   23

upper_bound 找到第一个大于 16 的行首元素:

复制代码
23

因此 row 指向:

复制代码
[23,30,34,60]

然后:

复制代码
--row;

退回:

复制代码
[10,11,16,20]

最后:

复制代码
binary_search(...)

在这一行中继续二分查找 16

所以整道题可以记成:

第一次二分确定 target 可能在哪一行,第二次二分在这一行里找 target。

时间复杂度:

复制代码
找行:O(log m)
行内查找:O(log n)

总复杂度:O(log m + log n)
         = O(log(m*n))

空间复杂度:

复制代码
O(1)

另外更推荐函数参数写成引用:

复制代码
bool searchMatrix(vector<vector<int>>& matrix, int target)

这样不会复制整个二维矩阵。

相关推荐
小飞象—木兮1 小时前
BCG波士顿矩阵深度解析及应用指南:核心逻辑、落地路径、常见误区、案例
大数据·人工智能·矩阵·数据分析·用户运营
浪里镖客1 小时前
位姿转换矩阵中旋转与平移转换的问题--解决方案
线性代数·矩阵
新知图书1 小时前
第 14 章 后训练算法GRPO详解与实战
人工智能·算法
shirsl3 小时前
算法 Day1-数组 / 哈希 + 双指针
python·算法·哈希算法
2601_9677607810 小时前
2026年PDF压缩与页码添加工具技术实测:性能、算法与本地化适配深度对比
算法·pdf
不会就选b11 小时前
算法日常・每日刷题--<贪心>7
数据结构·算法·leetcode
moonrailgun11 小时前
用 Node.js 复刻 Codex Astra 的终端星光
前端·javascript·算法
罗西的思考12 小时前
[Agent Memory / 强化学习] MemPO源码学习笔记 ---(1)--- 总体
人工智能·算法·机器学习
lvwangshu12 小时前
图论:LCA、树的直径、树的重心、二分图与 Tarjan 缩点
算法·图论