LeetCode题解(面试10.09):排序矩阵查找(Python)

题目:原题链接(中等)

标签:二分查找、双指针、分治算法

解法时间复杂度空间复杂度执行用时
Ans 1 (Python) O ( N ) O(N) O(N) O ( N ) O(N) O(N)52ms (46.34%)
Ans 2 (Python) O ( l o g N ) O(logN) O(logN) O ( 1 ) O(1) O(1)44ms (83.92%)
Ans 3 (Python)

解法一:

class Solution:
    def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
        if not matrix or not matrix[0]:
            return False

        s1, s2 = len(matrix), len(matrix[0])

        i1, i2 = 0, bisect.bisect_left(matrix[0], target)
        last_change = 2

        while 0 <= i1 <= s1 and 0 <= i2 <= s2:
            # print(i1, i2, last_change)
            if last_change == 1 and i1 < s1 and matrix[i1][i2] == target:
                return True
            if last_change == 2 and i2 < s2 and matrix[i1][i2] == target:
                return True

            if last_change == 2:
                i2 -= 1
                i1 += bisect.bisect_left([row[i2] for row in matrix[i1:]], target) # O(N)
                last_change = 1
            else:  # last_change == 1
                if i1 < s1:
                    i2 = bisect.bisect_left(matrix[i1], target)
                    last_change = 2
                else:
                    return False

        return False

解法二(优化解法一):

class Solution:
    def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
        if not matrix or not matrix[0]:
            return False

        s1, s2 = len(matrix), len(matrix[0])
        i1, i2 = 0, s2

        while 0 <= i1 <= s1 and 0 <= i2 <= s2:
            # 纵向查找
            i2 -= 1
            l, r = i1, s1
            while l < r:
                m = (l + r) // 2
                if matrix[m][i2] < target:
                    l = m + 1
                elif matrix[m][i2] > target:
                    r = m
                else:
                    return True

            # 横向查找
            i1 = l
            if i1 < s1:
                l, r = i2, s2
                while l < r:
                    m = (l + r) // 2
                    if matrix[i1][m] < target:
                        l = m + 1
                    elif matrix[i1][m] > target:
                        r = m
                    else:
                        return True

                i2 = l
            else:
                return False

        return False
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值