从零开始写算法——二分-搜索二维矩阵

题目简述

二维矩阵满足:

  • 每一行从左到右递增

  • 每一行首元素大于上一行最后一个元素

这意味着矩阵整体呈现严格递增的一维序列

例如:

cpp 复制代码
[
  [1, 3, 5, 7],
  [10,11,16,20],
  [23,30,34,60]
]

可以视为:

cpp 复制代码
1,3,5,7,10,11,16,20,23,30,34,60

核心思想:二维转一维

二维矩阵按行拼接,即坐标映射:

cpp 复制代码
i → (i / n, i % n)

其中:

  • n 是列数

  • i / n 是行号

  • i % n 是列号

二分查找代码(闭区间写法)

cpp 复制代码
class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        int m = matrix.size();
        int n = matrix[0].size();

        int left = 0;
        int right = m * n - 1;  // 一维区间 [0, m*n-1]

        while (left <= right) {
            int mid = left + (right - left) / 2;

            // mid / n → 行
            // mid % n → 列
            if (matrix[mid / n][mid % n] < target) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }

        // 💥 关键:避免越界访问 matrix[left]
        if (left == m * n) return false;

        return matrix[left / n][left % n] == target;
    }
};

重点:闭区间二分为什么会越界?

闭区间写法:

cpp 复制代码
left = 0
right = size-1
while (left <= right)

这一写法的返回值有一个特点:

最终的 left 可能等于 size

这是完全符合设计的,因为:

  • 如果所有元素都小于 target

    ⇒ 返回应该是第一个大于等于 target 的位置

    ⇒ 也就是 size

    ⇒ left == size

但问题来了:

你一旦直接访问:

cpp 复制代码
nums[left]

left == size

cpp 复制代码
nums[size]  // 非法访问,越界 ❌

如何避免越界?

只要使用闭区间写法,就必须判断:

cpp 复制代码
if (left == size) return ...

总结

闭区间写法凡是涉及到访问numssize一定要注意边界访问越界问题。

二维搜索矩阵的核心:

  • 把矩阵视为一维递增数组

  • mid / nmid % n 完成坐标映射

闭区间写法最大的坑:

最终 left 可能等于数组长度(size),访问会越界

所以必须判断:

cpp 复制代码
if (left == size) return ...;

为什么需要判断?

  • 因为 left = size 是合法返回值,但不是合法下标
相关推荐
倒头就睡的小比特1 天前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!1 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼1 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
旖旎夜光1 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark1 天前
大规模并行计算中的负载均衡算法研究4
算法
Because_of_Her11 天前
并查集-听课笔记
笔记·算法·并查集
码流子1 天前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
another heaven1 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
wzdark1 天前
从算法设计模式看编程思维的抽象能力4
算法
2601_962218611 天前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法