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

题目简述

二维矩阵满足:

  • 每一行从左到右递增

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

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

例如:

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 ...

总结

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

二维搜索矩阵的核心:

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

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

闭区间写法最大的坑:

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

所以必须判断:

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

为什么需要判断?

  • 因为 left = size 是合法返回值,但不是合法下标
相关推荐
梨子串桃子_7 小时前
推荐系统学习笔记 | PyTorch学习笔记
pytorch·笔记·python·学习·算法
夏鹏今天学习了吗7 小时前
【LeetCode热题100(83/100)】最长递增子序列
算法·leetcode·职场和发展
情缘晓梦.7 小时前
C语言指针进阶
java·开发语言·算法
北邮刘老师8 小时前
智能体治理:人工智能时代信息化系统的全新挑战与课题
大数据·人工智能·算法·机器学习·智能体互联网
AlenTech8 小时前
155. 最小栈 - 力扣(LeetCode)
算法·leetcode·职场和发展
mit6.8249 小时前
正反两次扫描|单调性cut
算法
Yzzz-F9 小时前
牛客小白月赛127 E
算法
大锦终9 小时前
递归回溯综合练习
c++·算法·深度优先
Keep__Fighting9 小时前
【神经网络的训练策略选取】
人工智能·深度学习·神经网络·算法
晚风吹长发9 小时前
初步了解Linux中的动静态库及其制作和使用
linux·运维·服务器·数据结构·c++·后端·算法