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 的比较过程!

相关推荐
BothSavage5 小时前
Trae远程开发中DeepSeek自定义模型4054错误的排查与修复
算法
小林ixn5 小时前
从暴力到KMP:一道题彻底搞懂字符串匹配的前世今生
算法
烬羽6 小时前
字符串算法入门:从反转字符串到回文判断,面试不再慌
算法·面试
先吃饱再说1 天前
判断回文字符串,从一行代码到双指针优化
算法
黄敬峰1 天前
深入理解算法核心:从递归思想、数组扁平化到快速排序
算法
得物技术1 天前
从狂野代码到按目标生产:得物推荐 AI Harness 的工程化实践|AICon 演讲整理
人工智能·算法·架构
AI小老六1 天前
SkillOpt 架构拆解:把 Skill 文本当参数,用执行轨迹训练 Agent
后端·算法·ai编程
胡萝卜术1 天前
从“分数打架”到“排名投票”:为什么你的ChatBI必须用RRF?
算法·设计模式·面试
Asize1 天前
初识DFS 与 BFS:递归、队列与图遍历
算法