搜索二维矩阵
题目要求:
给你一个满足下述两条属性的 m x n 整数矩阵:
每行中的整数从左到右按非严格递增顺序排列。
每行的第一个整数大于前一行的最后一个整数。
给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。
核心思路:
根据题目给出的两个属性:
- 每行升序
- 下一行的首元素大于上一行的尾元素
这两个条件意味着,如果我们把这个矩阵按首尾相连,它实际上就是一个完全升序的一维数组。因此最有效的解法是使用二分查找,时间复杂度为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)。我们只使用了常数个变量,没有开辟额外的存储空间。
为什么不逐行查找?
虽然你可以线二分查找在哪一行,再在那一行二分查找目标,但直接将其视为一维数组的代码更简洁,且逻辑上是一致的。
浙公网安备 33010602011771号