【Leetcode】74. 搜索二维矩阵

You are given an m x n integer matrix matrix with the following two properties:

Each row is sorted in non-decreasing order .

The first integer of each row is greater than the last integer of the previous row.

Given an integer target, return true if target is in matrix or false otherwise.

You must write a solution in O(log(m * n))time complexity.

Example 1 :

bash 复制代码
Input: matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
Output: true

Example 2:

bash 复制代码
Input: matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
Output: false

Constraints:

bash 复制代码
m == matrix.length
n == matrix[i].length
1 <= m, n <= 100
-104 <= matrix[i][j], target <= 104

AC:

cpp 复制代码
/*
 * @lc app=leetcode.cn id=74 lang=cpp
 *
 * [74] 搜索二维矩阵
 */

// @lc code=start
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);
    }
};
// @lc code=end

与此同时,需要关注几个函数的用法:

The binary_search function is a built-in function in C++ that is used to check if a particular element exists in a sorted range or not. It uses the binary search algorithm internally to perform this operation.

Here's how you use it:

cpp 复制代码
bool found = binary_search(startIterator, endIterator, value);
  • startIterator and endIterator define the range in which to search for the value. These could be the begin() and end() iterators of a container like a vector or an array.
  • value is the element you are looking for.
  • The function returns a boolean value: true if the element is found, false otherwise.

In your code, binary_search is used to check if the target exists in the row of the matrix that could potentially contain the target.

cpp 复制代码
return binary_search(row->begin(), row->end(), target);

Here, row->begin() and row->end() define the range (i.e., the row in the matrix), and target is the value you're looking for. The function will return true if the target is found in the specified row, false otherwise.

std::upper_bound() 是 C++ 标准库中的一个算法,用于在排序的范围中查找第一个大于给定值的元素的位置

在你给出的代码中,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()matrix.end() 分别返回 matrix 向量的开始迭代器和结束迭代器,定义了一个范围,这个范围包含了 matrix 向量中的所有元素。

target 是我们要查找的值。

最后一个参数是一个比较函数 ,它接受两个参数:一个是 target,另一个是 matrix 中的元素(在这里是一个向量)。这个函数返回 true 如果 target 小于向量的第一个元素,否则返回 false

所以,这行代码的效果就是找到 matrix 中第一个其第一个元素大于 target 的向量的位置。如果所有向量的第一个元素都不大于 target,那么 upper_bound() 将返回 matrix.end()

注意,upper_bound() 假设范围内的元素是已排序的。如果元素没有排序,那么 upper_bound() 的结果将是未定义的。

在这段代码中,row 是一个迭代器(iterator),它指向 matrix 中的一个元素。因为 matrix 是一个二维向量(vector<vector<int>>),所以 matrix 中的一个元素是一个 vector<int>。因此,row 的类型是 vector<vector<int>>::iterator,或者等价地,vector<int>::iterator

upper_bound() 函数返回的就是这样一个迭代器 ,它指向 matrix 中第一个其第一个元素大于 target 的向量的位置。如果所有向量的第一个元素都不大于 target,那么 upper_bound() 将返回 matrix.end(),这是一个特殊的迭代器,表示 matrix 的末尾,即 matrix 中的"过去最后一个"元素的位置。

相关推荐
超级码力6665 小时前
【Latex文件架构】Latex文件架构模板
算法·数学建模·信息可视化
穿条秋裤到处跑5 小时前
每日一道leetcode(2026.04.29):二维网格图中探测环
算法·leetcode·职场和发展
Merlos_wind6 小时前
HashMap详解
算法·哈希算法·散列表
汉克老师6 小时前
GESP2025年3月认证C++五级( 第三部分编程题(1、平均分配))
c++·算法·贪心算法·排序·gesp5级·gesp五级
Yzzz-F8 小时前
Problem - 2205D - Codeforces
算法
智者知已应修善业9 小时前
【51单片机2个按键控制流水灯运行与暂停】2023-9-6
c++·经验分享·笔记·算法·51单片机
Halo_tjn9 小时前
Java Set集合相关知识点
java·开发语言·算法
生成论实验室10 小时前
《事件关系阴阳博弈动力学:识势应势之道》第四篇:降U动力学——认知确定度的自驱演化
人工智能·科技·神经网络·算法·架构
AI科技星10 小时前
全域数学·72分册:场计算机卷【乖乖数学】
算法·机器学习·数学建模·数据挖掘·量子计算
科研前沿11 小时前
镜像孪生VS视频孪生核心技术产品核心优势
大数据·人工智能·算法·重构·空间计算