day128—二分查找—搜索二维矩阵(LeetCode-74)

题目描述

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

  • 每行中的整数从左到右按非严格递增顺序排列。
  • 每行的第一个整数大于前一行的最后一个整数。

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

示例 1:

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

示例 2:

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

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 100
  • -104 <= matrix[i][j], target <= 104

解决方案:

核心逻辑

代码利用矩阵 "每行升序、行尾元素递增" 的特性,分两步完成查找:

  1. 定位目标行 :遍历矩阵的每一行,通过比较 target 与当前行的最后一个元素,找到第一个行尾元素 ≥ target 的行(目标值若存在,必在这一行);
  2. 单行二分查找 :调用 lower_bound 函数,在定位到的行中使用开区间二分法left=-1right=列数,循环条件 left+1<right)查找 target,找到则返回 true,否则返回 false
  3. 若遍历完所有行都未找到符合条件的行,直接返回 false

总结

  1. 核心思路:先通过行尾元素快速缩小目标范围到某一行,再在该行内用二分查找精准定位,兼顾简洁性和效率;
  2. 关键设计:lower_bound 函数采用开区间二分法,简化了单行查找的边界处理;
  3. 适用场景:仅适用于 "每行升序、行尾元素递增" 的二维矩阵,是该类矩阵查找的经典解法。

函数源码:

cpp 复制代码
class Solution {
public:
    bool lower_bound(vector<int>& nums,int left,int right, int x){
        int len=nums.size();
        int mid=0;
        while(left+1<right){
            mid=(left+right)/2;
            if(nums[mid]<x) left=mid;
            else            right=mid;
        }
        return nums[right]==x? true:false;
    }

    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        int len=matrix.size();
        int row_len=matrix[0].size();
        for(int i=0;i<len;i++){
            if(target<=matrix[i][row_len-1]){
                return lower_bound(matrix[i],-1,matrix[i].size(),target);
            }
        }
        return false;
    }
};
相关推荐
To_OC2 天前
LC 207 课程表:刚学图论那会儿,我连这是拓扑排序都没看出来
javascript·算法·leetcode
To_OC2 天前
LC 208 实现 Trie 前缀树:曾被名字劝退,写完发现是送分题
javascript·算法·leetcode
To_OC3 天前
LC 994 腐烂的橘子:人人都说是 BFS 入门题,我却写了三遍才过
javascript·算法·leetcode
To_OC4 天前
LC 200 岛屿数量:经典 DFS 入门题,我第一次写居然连方向都搞错了
javascript·算法·leetcode
To_OC4 天前
LC 128 最长连续序列:别上来就排序,O (n) 解法才是这题的灵魂
javascript·算法·leetcode
To_OC6 天前
LC 49 字母异位词分组:想到哈希表很简单,选对 key 才是精髓
javascript·算法·leetcode
To_OC8 天前
LC 1 两数之和:面试第一道必考题,暴力解法直接被面试官 pass
javascript·算法·leetcode
Bobolink_14 天前
TikTok矩阵账号如何批量养号?工作室级运营方案分享
矩阵·内容运营·跨境电商·tik tok·账号运营
想吃火锅100514 天前
【leetcode】121.买卖股票的最佳时机js/c++
算法·leetcode·职场和发展
凌波粒14 天前
LeetCode--491.递增子序列(回溯算法)
数据结构·算法·leetcode