74.搜索二维矩阵

目录

题目

给你一个满足下述两条属性的 m x n 整数矩阵:

每行中的整数从左到右按非严格递增顺序排列。

每行的第一个整数大于前一行的最后一个整数。

给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。

解法

cpp 复制代码
class Solution {
public:
    bool searchMatrix(vector<vector<int>> matrix, int target) {
        auto row = upper_bound(matrix.begin(), matrix.end(), target, [](const int b, const vector<int> &a) {
            return b < a[0];
        });
        if (row == matrix.begin()) {
            return false;
        }
        --row;
        return binary_search(row->begin(), row->end(), target);
    }
};

演示upper_bound比较的过程

好的,让我们通过一个具体的例子来演示 upper_bound 的比较过程。

示例矩阵

假设我们有以下的二维矩阵 matrix 和目标值 target

cpp 复制代码
vector<vector<int>> matrix = {
    {1, 3, 5},
    {7, 10, 11},
    {12, 14, 16},
    {20, 22, 24}
};
int target = 9;

upper_bound 的使用

在这个例子中,我们要找到 target(9)在 matrix 中的可能位置。我们使用 upper_bound

cpp 复制代码
auto row = upper_bound(matrix.begin(), matrix.end(), target, [](const int b, const vector<int> &a) {
    return b < a[0];
});

比较过程

  • matrix.begin() 指向第一行 {1, 3, 5},第一个元素是 1
  • matrix.end() 指向超出最后一行的迭代器,表示没有更多行。
比较步骤
  1. 第一轮比较

    • b = 9a = {1, 3, 5}
    • 判断 9 < 1,结果为 false
    • 因为 falseupper_bound 继续检查下一行。
  2. 第二轮比较

    • b = 9a = {7, 10, 11}
    • 判断 9 < 7,结果为 false
    • 继续检查下一行。
  3. 第三轮比较

    • b = 9a = {12, 14, 16}
    • 判断 9 < 12,结果为 true
    • 此时,upper_bound 找到了第一个大于 9 的行,因此返回该行的迭代器。

结果

  • row 现在指向 {12, 14, 16} 这一行的开始位置。
  • 然后我们执行 --row,将其移动到 {7, 10, 11} 这一行。
  • 最后在 {7, 10, 11} 这一行使用 binary_search 查找 target(9)。

总结

在这个例子中,upper_bound 找到的是第一个大于 9 的行({12, 14, 16}),而在实际查找中,我们确定 9 可能在 {7, 10, 11} 这一行中。通过这种方式,upper_bound 允许我们快速定位目标值可能出现的行。希望这个例子能帮助你理解 upper_bound 的比较过程!

相关推荐
微三云 - 廖会灵 (私域系统开发)9 小时前
私域电商多端商城系统架构实践:小程序 / APP / H5 一套后端如何落地
矩阵·重构·零售
AgentMaster9 小时前
数据资产化落地难题:5款数据中台系统架构对比与实施记录
大数据·人工智能·算法
Logic10110 小时前
C语言/数据结构动态规划题解:Kadane算法求最大子数组和——O(n)时间O(1)空间
c语言·数据结构·动态规划·贪心·时间复杂度·算法题·最大子数组和
鹿角片ljp10 小时前
从 Kimi Cyber Reasoning 学习网络安全推理数据集:从 Reasoning SFT 到安全 Agent 数据设计
数据结构·算法
微三云 - 廖会灵 (私域系统开发)10 小时前
多端商城统一账号体系设计实践:小程序 / APP / H5 登录打通与账号合并
矩阵·重构·自动化·零售
residual_fan11 小时前
航空发动机故障诊断专用智能体(三):基于对比学习的时序特征区分方法
人工智能·算法·数据挖掘·数据分析
Logic10111 小时前
C语言/数据结构位运算题解:异或XOR找出数据表中的“独特编号“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
高亦真11 小时前
今天是学习嵌入式的第39天
linux·学习·算法
Omics Pro12 小时前
AI药物研发10原则!欧盟EMA×美国FDA
数据库·人工智能·算法·机器学习·自然语言处理
wabs66612 小时前
关于二叉树【力扣100.相同的树的思考】
数据结构·c++·算法·leetcode·二叉树·递归法