编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
每行中的整数从左到右按升序排列。
每行的第一个整数大于前一行的最后一个整数。
示例 1:
输入:
matrix = [
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
target = 3
输出: true
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/search-a-2d-matrix
思路:采用两次二分法分别确定值所在区间。
class Solution:
def searchMatrix(self, matrix: [[int]], target: int) -> bool:
if (not matrix or not matrix[0]):return False
lenm=len(matrix)
lenn=len(matrix[0])
#两次二分法
#第一次行方向考虑
up=0
down=lenm
while(up<down):
mid=(up+down)//2
if(matrix[mid][lenn-1]<target):
up=mid+1
elif(matrix[mid][0]>target):
down=mid-1
else:
up=mid
break
if(up>=lenm):return False
#第二次列方向考虑
left=0
right=lenn
while(left<right):
mid=(left+right)//2
if(matrix[up][mid]==target):
return True
elif(matrix[up][mid]>target):
right=mid
elif(matrix[up][mid]<target):
left=mid+1
return False
if __name__=="__main__":
print(Solution().searchMatrix([
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
],21))