搜索二维矩阵

题目要求
给你一个满足下述两条属性的 m x n 整数矩阵:
每行中的整数从左到右按非严格递增顺序排列。
每行的第一个整数大于前一行的最后一个整数。
给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。

核心思路
根据题目给出的两个属性:

  1. 每行升序
  2. 下一行的首元素大于上一行的尾元素

这两个条件意味着,如果我们把这个矩阵按首尾相连,它实际上就是一个完全升序的一维数组。因此最有效的解法是使用二分查找,时间复杂度为O(log(m×n))。

关键点解析

  • 索引映射公式
    这是本体最优雅的处理方式。对于一个m×n的矩阵,索引为i的元素在:

    • 行索引:row = i/n(原因:列数n代表,每n个数组成一行,对列数的整除表示处于第几组,也就对应矩阵中的第几行,当i<n的时候,整除结果为0正好对应第一行的索引0)
    • 列索引:col = i%n(原因:被列数整除的结果代表第几组,余数则是该组中的第几个元素,正好对应矩阵的列数。当i=n的时候,整除结果为0,正好对应第一列的索引0)
  • 时间复杂度:O(log(m×n))。二分查找的效率极高,即便矩阵很大也能快速定位。

  • 空间复杂度:O(1)。我们只使用了常数个变量,没有开辟额外的存储空间。

为什么不逐行查找?
虽然你可以线二分查找在哪一行,再在那一行二分查找目标,但直接将其视为一维数组的代码更简洁,且逻辑上是一致的。

posted @ 2026-05-13 09:37  ZealousMclaren  阅读(10)  评论(0)    收藏  举报