二维数组的二分法

题目描述

编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:

每行中的整数从左到右按升序排列。
每行的第一个整数大于前一行的最后一个整数。
示例 1:

输入:
matrix = [
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
target = 3
输出: true
示例 2:

输入:
matrix = [
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
target = 13
输出: false

思路

简单来说就是将一个一维有序数组切成若干长度相同的段,然后将这些段拼接成一个二维数组。你的任务就是在这个拼接成的二维数组中找到 target。

需要注意的是,数组是不存在重复元素的。

如果有重复元素,我们该怎么办?

算法:

选择矩阵左下角作为起始元素 Q
如果 Q > target,右方和下方的元素没有必要看了(相对于一维数组的右边元素)
如果 Q < target,左方和上方的元素没有必要看了(相对于一维数组的左边元素)
如果 Q == target ,直接 返回 True
交回了都找不到,返回 False

#代码(Python)
class Solution:
    def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
        m = len(matrix)
        if m == 0:
            return False
        n = len(matrix[0])

        x = m - 1
        y = 0
        while x >= 0 and y < n:
            if matrix[x][y] > target:
                x -= 1
            elif matrix[x][y] < target:
                y += 1
            else:
                return True
        return False

复杂度分析

时间复杂度:最坏的情况是只有一行或者只有一列,此时时间复杂度为 O ( M ∗ N ) O(M * N) O(MN)。更多的情况下时间复杂度为 O ( M + N ) O(M + N) O(M+N)
空间复杂度: O ( 1 ) O(1) O(1)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值