74. 搜索二维矩阵 - medium
编写一个高效的算法来判断 m x n
矩阵中,是否存在一个目标值。该矩阵具有如下特性:
- 每行中的整数从左到右按升序排列。
- 每行的第一个整数大于前一行的最后一个整数。
示例 1:
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3 输出:true
示例 2:
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13 输出:false
提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 100
-104 <= matrix[i][j], target <= 104
先定位行,再定位值。
时间复杂度 O(log m + log n) = O(log m*n);空间复杂度 O(1)
class Solution:
def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
if matrix[-1][-1] < target or matrix[0][0] > target:
return False
def findrow(l, r) -> int:
if l + 1 == r:
return l
m = (l + r) // 2
if matrix[m][0] <= target:
return findrow(m, r)
return findrow(l, m)
r = findrow(0, len(matrix))
def find(nums: List[int], l, r) -> bool:
if l >= r:
return nums[l] == target
m = (l + r) // 2
if nums[m] < target:
return find(nums, m+1, r)
return find(nums, l, m)
return find(matrix[r], 0, len(matrix[r]) - 1)
题解中有个思路,将每行连起来看作是一个升序数组,一次二分查找即可。