74. 搜索二维矩阵
问题链接
https://leetcode.cn/problems/search-a-2d-matrix/description/
解题思路
我们可以确定,数据是有序的。所以我们有2种办法用二分来解决。
第一种,我们可以写个下标映射函数,把矩阵当做一维数组来进行遍历。
第二种,我们可以先对列进行二分,得到数据存在于哪个行。
然后对这个行进行二分,得到数据存在与否。
此时我们选择第二种方式。
代码
class Solution: def searchMatrix(self, matrix: List[List[int]], target: int) -> bool: left, right = 0, len(matrix)-1 target_idx = -1 while left <= right: mid = (left+right)>>1 if matrix[mid][0]<=target<=matrix[mid][-1]: target_idx = mid break elif matrix[mid][0]>target: right = mid - 1 else: left = mid + 1 if target_idx == -1: return False left, right = 0, len(matrix[target_idx])-1 while left <= right: mid = (left+right)>>1 if matrix[target_idx][mid] == target: return True elif matrix[target_idx][mid] < target: left = mid + 1 else: right = mid - 1 return False
二刷:
class Solution: def searchMatrix(self, matrix: List[List[int]], target: int) -> bool: up, down = 0, len(matrix)-1 while up <= down: ud_mid = (up + down) >> 1 if matrix[ud_mid][0] <= target <= matrix[ud_mid][-1]: left, right = 0, len(matrix[ud_mid])-1 while left <= right: mid = (left+right)>>1 if matrix[ud_mid][mid] == target: return True elif matrix[ud_mid][mid] < target: left = mid + 1 else: right = mid - 1 return False elif matrix[ud_mid][0] > target: down = ud_mid - 1 else: up = ud_mid + 1 return False