搜索二维矩阵
描述
中等
编写一个高效的算法来判断 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:
if len(matrix) == 0 or len(matrix[0]) == 0 or matrix[0][0] > target or matrix[-1][-1] < target:
return False
m = []
for i in matrix:
m += i
left = 0
right = len(m)-1
while left <= right:
mid = (left+right) // 2
if m[mid] == target:
return True
elif m[mid] > target:
right = mid-1
else:
left = mid+1
return False
既然是二维矩阵,那么就要以二维矩阵来做
干脆,先用二分找数据所在的行,再用二分找列,哈哈
class Solution:
def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
if len(matrix) == 0 or len(matrix[0]) == 0 or matrix[0][0] > target or matrix[-1][-1] < target:
return False
up = 0
down = len(matrix)-1
left = 0
right = len(matrix[0])-1
row = 0
while up <= down:
mid = (up+down) // 1
if matrix[mid][0] <= target and matrix[mid][right] >= target:
row = mid
break
elif matrix[mid][right] < target:
up += 1
elif matrix[mid][0] > target:
down -= 1
while left <= right:
mid = (left+right) // 2
if matrix[row][mid] == target:
return True
elif matrix[row][mid] < target:
left = mid+1
else:
right = mid-1
return False
从矩阵的左上角开始向下开始查找,初始位置为(0, len(matrix[0])-1)
- 如果该数小于target,说明该行不可能存在target,只可能存在于下面几行的数据中,行数加1
- 如果该数大于target,说明target存在于该行,然后从第一个数开始查找
- 查找成功
class Solution:
def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
if len(matrix) == 0 or len(matrix[0]) == 0 or matrix[0][0] > target or matrix[-1][-1] < target:
return False
row = 0
col = len(matrix[0])-1
while row < len(matrix) and col >= 0:
if matrix[row][col] < target:
row += 1
elif matrix[row][col] >target:
col -= 1
else:
return True
return False