当前位置: 首页 > news >正文

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

题目简述

二维矩阵满足:

  • 每一行从左到右递增

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

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

例如:

[[1, 3, 5, 7],[10,11,16,20],[23,30,34,60]
]

可以视为:

1,3,5,7,10,11,16,20,23,30,34,60

核心思想:二维转一维

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

i → (i / n, i % n)

其中:

  • n 是列数

  • i / n 是行号

  • i % n 是列号

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

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;}
};

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

闭区间写法:

left = 0
right = size-1
while (left <= right)

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

最终的 left 可能等于 size

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

  • 如果所有元素都小于 target
    ⇒ 返回应该是第一个大于等于 target 的位置
    ⇒ 也就是 size
    ⇒ left == size

但问题来了:

你一旦直接访问:

nums[left]

left == size

nums[size]  // 非法访问,越界 ❌

如何避免越界?

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

if (left == size) return ...

总结

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

二维搜索矩阵的核心:

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

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

闭区间写法最大的坑:

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

所以必须判断:

if (left == size) return ...;

为什么需要判断?

  • 因为 left = size 是合法返回值,但不是合法下标

http://www.dtcms.com/a/613254.html

相关文章:

  • 力扣(LeetCode)100题:73.矩阵置零 54.螺旋矩阵
  • 原型理解从入门到精通
  • 电子商务实验网站建设实训过程出售东西的网站怎么做
  • 做明星网站可以做那些子网页建设网站要用到什么语言
  • 《计算机网络:体系结构》
  • musl libc 与 C 运行时文件(`crt*.o`):技术解析及移植报错问题
  • 前端WebSocket教程,实时通信案例
  • 陪诊陪检系统源码,陪诊小程序,陪诊APP,陪诊服务,家政上门系统,居家护理陪护源码
  • Java 9+模块化系统(JPMS)详解:设计与迁移实践
  • 【计算机网络】考研408 | 数据链路层的“安全卫士”:探秘检错编码之奇偶校验码
  • Oracle EBS 调用标准创建供应商地点包报错处理
  • 第40节:AR基础:Marker识别与跟踪
  • 新能源汽车动力系统在环(HIL)半实物仿真测试台架深度解析
  • 企业BI建议--数据治理平台
  • 锒川市住房和城乡建设局网站公告湖北省建设工程质量安全监督网站
  • 从裂变能力竞争到技术水平竞争:开源AI智能名片链动2+1模式S2B2C商城小程序对微商企业竞争格局的重塑
  • 09-mcp-server案例分享-即梦MCP-Server实战教程-让Claude直接调用AI生图视频能力
  • SpringBoot18-redis的配置
  • PHP 表单 - 必需字段
  • python爬虫入门案例day05:Pexels
  • android studio Gradle 打包任务配置
  • 【AI学习-comfyUI学习-1批量抠图换背景工作流+2视频抠图工作流-各个部分学习-第十节】
  • Redis(124)Redis在电商系统中的应用有哪些?
  • [Dify 实战案例] 用 Dify 做一个多语种文档翻译工具:支持 TXT / DOCX / XLSX / PPTX 全格式
  • 自然语言编程:从一段Perl程序说起
  • OpenAI Whisper:技术、实战、生态
  • 【ZeroRange WebRTC】DTLS(Datagram Transport Layer Security)技术深度分析
  • 南京本地网站合肥建网站要多少钱
  • 从丝印判断ESP32-WROOM-32E模组Flash容量
  • react 学习