题目
在一个m*n的二维数组matrix
中判断目标值target
是否存在,该二维数组具有以下性质:
- 每行中的整数从左到右按升序排列。
- 每行的第一个整数大于前一行的最后一个整数。
例子
searchMatrix([[1,3,5,7],[10,11,16,20],[23,30,34,60]],3) -> True
searchMatrix([[1,3,5,7],[10,11,16,20],[23,30,34,60]],13) -> False
假设
- 输入的二维数组不为空
tips
- 二分查找
- 一位坐标映射二维坐标
答案
解法1
def searchMatrix(matrix,target):
m = len(matrix)
n = len(matrix[0])
left , right = 0 , m * n - 1
while left <= right:
pivot_idx = (left + right) // 2
pivot_element = matrix[pivot_idx // n][pivot_idx % n]
if target == pivot_element:
return True
else:
if target < pivot_element:
right = pivot_idx - 1
else:
left = pivot_idx + 1
return False
性能:
- 时间复杂度
O(logmn)
- 空间复杂度
O(1)
关键点:
- 二分查找
- 一位坐标映射二维坐标
解法2:
def searchMatrix(matrix, target):
"""
1. 找到tatget所在的列表
2. 使用二分法判断
:param matrix:
:param target:
:return:
"""
if not matrix:
return False
for item in matrix:
if item[0] <= target <= item[-1]:
i, j = 0, len(item) - 1
while i <= j:
m = (i + j) // 2
if item[m] == target:
return True
elif item[m] < target:
j = m - 1
else:
i = m + 1
return False
return False