题目描述
编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性:
- 每行的元素从左到右升序排列。
- 每列的元素从上到下升序排列。
示例:
现有矩阵 matrix 如下:
[
[1, 4, 7, 11, 15],
[2, 5, 8, 12, 19],
[3, 6, 9, 16, 22],
[10, 13, 14, 17, 24],
[18, 21, 23, 26, 30]
]
给定 target = 5
,返回 true
。
给定 target = 20
,返回 false
。
我的解法——二分法(AC)
- m次二分查找
- 时间复杂度O(nlogn),空间复杂度O(1)
- Beat30%
class Solution(object):
def searchMatrix(self, matrix, target):
"""
:type matrix: List[List[int]]
:type target: int
:rtype: bool
"""
m = len(matrix)
if(m == 0):return False
n = len(matrix[0])
if(n == 0):return False
for nums in matrix:
l = 0
r = n - 1
while(l <= r):
mid = int((r - l)/2 + l)
if(nums[mid] == target):
return True
elif(nums[mid] > target):
r = mid - 1
else:
l = mid + 1
return False
最优解法
-
分治法求解,首先根据矩阵的特点,横向和纵向是分别升序的。可以从右上角或者左下角进行判断。拿左下角来说
- 如果比target大,那么需要往上走,因为当前行的右边都比它大
- 如果比target小,那么需要往右走,因为当前列的上面比它都小
- 相等则命中
-
时间复杂度O(m+n) n 为行数,m为列数。