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)

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

相关推荐
罗湖老棍子6 小时前
【例 1】Sightseeing Trip(信息学奥赛一本通- P1494)(洛谷-P10927)
数据结构·算法·图论·最短路·floyd·最小环
文丑颜不良啊6 小时前
LeetCode201~225题目解析
java·leetcode
stsdddd8 小时前
YOLO算法建筑工地安全帽目标检测数据集16881张:标注核对笔记
算法·yolo·目标检测
CV爱数码9 小时前
论文精读|Learned Primal-Dual:把原始–对偶算法展开成网络
图像处理·算法·计算机视觉·ct·重建·断层扫描
yuniko-n9 小时前
【算法】约瑟夫环问题
java·算法
l1t9 小时前
测试DuckDB v2.1.0-alpha49002的bignum乘法
数据库·sql·算法·duckdb
Nil20810 小时前
LeetCode 283移动零
数据结构·算法·leetcode
CQU_JIAKE10 小时前
10.18【A】
算法
LMT流氓兔10 小时前
第五单元——第4课:给工具参数加校验
java·前端·算法·ai·langchain
文丑颜不良啊11 小时前
LeetCode226~250题目解析
java·leetcode