音乐
音乐
暂未播放
0:00/0:00
暂无歌词
LeetCode | 搜索二维矩阵
520 字
3 分钟
LeetCode | 搜索二维矩阵
分类:二分查找 / 数组 / 矩阵
题目#
给你一个满足下述两条属性的 m x n 整数矩阵:
- 每行中的整数从左到右按非严格递增顺序排列。
- 每行的第一个整数大于前一行的最后一个整数。
给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。
讲解#
二分法。
一维二分#
看成一维数组,在 [0, m * n) 这个范围里做二分,找第一个大于等于 target 的位置。
两次二分#
第二种方法是做两次二分。
第一次二分先找 target 可能在哪一行。
找到这一行之后,再对这一行做一次普通二分查找。
复杂度#
- 一维二分:
- 时间复杂度:
O(log(m * n)) - 空间复杂度:
O(1)
- 时间复杂度:
- 两次二分:
- 时间复杂度:
O(log(m) + log(n)) - 空间复杂度:
O(1)
- 时间复杂度:
因为 log(m) + log(n) = log(m * n),所以两种方法的时间复杂度本质上是一样的。
代码#
一维二分#
源码#
1from typing import List2
3
4class Solution:5 def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:6 m = len(matrix)7 n = len(matrix[0])8 left = 09 right = m * n10
11 while left < right:12 mid = (left + right) // 213 x = matrix[mid // n][mid % n]14 if x < target:15 left = mid + 116 else:17 right = mid18
19 return left < m * n and matrix[left // n][left % n] == target两次二分#
源码#
1from typing import List2
3
4class Solution:5 def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:6 m = len(matrix)7 n = len(matrix[0])8
9 top = 010 bottom = m - 111 while top <= bottom:12 row = (top + bottom) // 213 if matrix[row][0] <= target <= matrix[row][n - 1]:14 break15 if matrix[row][0] > target:16 bottom = row - 117 else:18 top = row + 119
20 if top > bottom:21 return False22
23 left = 024 right = n - 125 while left <= right:26 mid = (left + right) // 227 if matrix[row][mid] == target:28 return True29 if matrix[row][mid] < target:30 left = mid + 131 else:32 right = mid - 133
34 return False测试#
1from src.python._074_Search_A_2D_Matrix import Solution2
3
4sol = Solution()5
6matrix = [[1, 3, 5, 7], [10, 11, 16, 20], [23, 30, 34, 60]]7assert sol.searchMatrix(matrix, 3) is True8assert sol.searchMatrix(matrix, 13) is False9assert sol.searchMatrix([[1]], 1) is True10assert sol.searchMatrix([[1]], 2) is False11
12print("PASS")参考资料#
- LeetCode 原题:https://leetcode.com/problems/search-a-2d-matrix/
- AlgoMonster 一维二分题解:https://algo.monster/liteproblems/74
- 两次二分参考题解:https://blog.csdn.net/weixin_56980169/article/details/135609735
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
LeetCode | 搜索二维矩阵
https://leetcode.com/problems/search-a-2d-matrix/最后更新于 2026-08-04
部分内容可能已过时
相关文章智能推荐
1
LeetCode | 搜索插入位置
LeetCodeLeetCode 搜索插入位置题解:用二分查找在升序数组中找到目标位置或插入位置。
2
LeetCode | 矩阵置零
LeetCodeLeetCode 矩阵置零题解:使用行列标记数组记录需要清零的位置,再统一修改原矩阵。
3
LeetCode | 搜索旋转排序数组
LeetCodeLeetCode 搜索旋转排序数组题解:在旋转数组中判断有序半区,再用二分缩小范围。
4
LeetCode | 寻找旋转排序数组中的最小值
LeetCodeLeetCode 寻找旋转排序数组中的最小值题解:比较 nums[mid] 与 nums[right],定位旋转断点。
5
LeetCode | 寻找两个正序数组的中位数
LeetCodeLeetCode 寻找两个正序数组的中位数题解:用二分查找切分位置,在 O(log(min(m,n))) 时间内求中位数。
随机文章随机推荐
暂无随机文章
评论区
分享你的想法,与大家交流讨论
--
总访问量
--
访客数
公告
音乐
音乐
暂未播放
0:00/0:00
暂无歌词
站点统计
文章
66
分类
16
标签
93
总字数
477,284
运行时长
0 天
最后活动
0 天前
最新动态



