[Leetcode]搜索二维矩阵
题目描述
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
每行中的整数从左到右按升序排列。
每行的第一个整数大于前一行的最后一个整数。
示例 1:
输入:
matrix = [
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
target = 3
输出: true
示例 2:
输入:
matrix = [
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
target = 13
输出: false
实现代码
- 从左下角位置开始找,小于数组值则向上,大于数组值则向右
class Solution:
def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
row = len(matrix)
if row == 0:
return False
col = len(matrix[0])
if col == 0:
return False
i = row - 1
j = 0
while i >= 0 and j <col:
if target < matrix[i][j]:
i -= 1
elif target > matrix[i][j]:
j += 1
else:
return True
return False
时间复杂度: O ( m + n ) O(m+n) O(m+n)
- 二分
- 因为是升序数组,可以把 m × n m\times n m×n二维数组看成是一个 [ 0 , m × n − 1 ] [0, m\times n-1] [0,m×n−1]的一维数组,然后用二分查找
class Solution:
def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
row = len(matrix)
if row == 0:
return False
col = len(matrix[0])
if col == 0:
return False
left, right = 0, row * col - 1
while left <= right:
mid = (left + right) // 2
if target < matrix[mid//col][mid%col]:#对应mid在二维数组中的位置
right = mid - 1
elif target > matrix[mid//col][mid%col]:
left = mid + 1
else:
return True
return False
时间复杂度: O ( l o g ( m n ) ) O(log(mn)) O(log(mn))