leet240. 搜索二维矩阵 II

题目:

编写一个高效的算法来搜索 m x n 矩阵中的一个目标值。该矩阵具有以下特性:

  • 每行的元素从左到右升序排列。
  • 每列的元素从上到下升序排列。

例如,

考虑下面的矩阵:

[
  [1,   4,  7, 11, 15],
  [2,   5,  8, 12, 19],
  [3,   6,  9, 16, 22],
  [10, 13, 14, 17, 24],
  [18, 21, 23, 26, 30]
]

给定目标值 target = 5, 返回 true

给定目标值 target = 20, 返回 false

分析:

  1. 首先通过二分法,对比每行尾部元素与目标元素,排除目标元素不可能存在的行,时间复杂度O(lgn);
  2. 遍历目标元素可能存在的行,使用二分法,在各行中寻找目标元素,直到下一行的头部元素大于目标值或找到目标值,则终止

代码:

class Solution(object):
    def searchMatrix(self, matrix, target):
        """
        :type matrix: List[List[int]]
        :type target: int
        :rtype: bool
        """
        if (not matrix) or (not matrix[0]):
            return False
        if matrix[0][0] > target or matrix[-1][-1] < target:
            return False
        len0 = len(matrix)
        len1 = len(matrix[0])
        l = 0
        r = len0 - 1
        j = -1
        while l < r:
            mid = (l + r) // 2
            # print mid
            if matrix[mid][-1] == target:
                return True
            if matrix[mid][-1] > target:
                r = mid - 1
                # if matrix[r][-1] < target:
                #     j = mid
                #     break
            if matrix[mid][-1] < target:
                l = mid + 1
                if matrix[l][-1] > target:
                    j = l
                    break
        if j == -1:
            j = l
        print "j:%d"%j

        for x in matrix[j:]:
            if x[0] > target:
                return False
            l = 0
            r = len1 - 1
            while l < r:
                mid = (l + r) // 2
                if x[mid] == target:
                    return True
                if x[mid] > target:
                    r = mid - 1
                if x[mid] < target:
                    l = mid + 1
            if x[l] == target:
                return True
        return False

思考:

  1. 需要特殊处理的情况矩阵为[]、[[]]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

yzpwslc

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

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

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

打赏作者

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

抵扣说明:

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

余额充值