题目:
编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:
每行的元素从左到右升序排列。
每列的元素从上到下升序排列。
解答:
方法一:暴力解法
class Solution:
def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
m=len(matrix)
n=len(matrix[0])
if target<matrix[0][0] or target>matrix[m-1][n-1]:
return False
for i in range(m):
for j in range(n):
if matrix[i][j]==target:
return True
return False
方法二:对每行进行二分查找
class Solution:
def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
m=len(matrix)
n=len(matrix[0])
if target<matrix[0][0] or target>matrix[m-1][n-1]:
return False
def BinarySearch(arr):
l,r=0,n-1
while l<=r:
mid=l+(r-l)//2
if arr[mid]==target:
return True
elif arr[mid]<target:
l=mid+1
else:
r=mid-1
return False
for i in range(m):
#未遍历的最小元素大于target,之后都大于target
if matrix[i][0]>target:
return False
#当前行都小于target,可略过
elif matrix[i][n-1]<target:
continue
#对当前行进行二分查找
else:
if BinarySearch(matrix[i]):
return True
方法三:从右上角开始遍历:当前值大于target,向左走;当前值小于target,向下走;当前值等于target,返回True
class Solution:
def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
#从右上角出发,向左值变小,向下值变大
m=len(matrix)
n=len(matrix[0])
if target<matrix[0][0] or target>matrix[m-1][n-1]:
return False
i,j=0,n-1
while i<m and j>=0:
if matrix[i][j]==target:
return True
#向下走,去掉当前行
elif matrix[i][j]<target:
i+=1
#向左走,去掉当前列
else:
j-=1
return False