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

 

posted @ 2023-01-12 00:20  BJFU-VTH  阅读(14)  评论(0编辑  收藏  举报