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)

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

相关推荐
All for pursuit.1 小时前
【二分查找-2】34.在排序数组中查找元素的第一个和最后一个位置
数据结构·c++·算法·leetcode
泯泷1 小时前
为什么 AI 会"失忆"?——读懂 Agent 的记忆系统(一)
人工智能·算法·agent
需要8263 小时前
分布式 ID 生成:雪花算法、号段模式与时钟回拨
分布式·算法
垆边人似月.3 小时前
华为机考题:字符串分隔
算法·华为
CQU_JIAKE3 小时前
9.4【A】
算法
梦帮科技3 小时前
量子张量网络破局大模型:从矩阵乘积态 (MPS) 到张量列 (TT-SVD) 低秩收缩全推导
网络·数据结构·数据库·线性代数·矩阵·架构·模拟退火算法
CQU_JIAKE3 小时前
9.13[A]
算法
懿路向前3 小时前
【唤醒实战笔记】2026-09-29 | 智能体提示词迭代史(v1 → v8)
linux·笔记·算法
@陈小鱼4 小时前
基于CNN-Transformer的无袖带血压估计
人工智能·深度学习·神经网络·算法·cnn·transformer·血压
黄金龙PLUS4 小时前
5个1280比特大状态置换算法的设计与分析
算法·网络安全·密码学·哈希算法·同态加密