74:搜索二维矩阵

问题描述

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

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

示例

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

思路

这题其实就是把升序一维数组存储在了二维数组中,一个朴素的解法就是把它还原成一维数组再进行二分。这样的话复杂度很高,因为要还原一维数组。
有没有办法把二维数组当一维用呢? 可以的。我们可以根据一维数组推算出二维数组中的坐标。

AC代码

class Solution:
    def searchMatrix(self, matrix, target: int) -> bool:
        left = 0
        if len(matrix) == 0:
            return False
        if len(matrix[0]) == 0:
            return False
        width = len(matrix[0])
        right = len(matrix)*width-1
        while left <= right:
            mid = (left + right) // 2
            if matrix[mid//width][mid%width] == target:
                return True
            elif matrix[mid//width][mid%width] < target:
                left = mid + 1
            else:
                right = mid - 1
        return False
s = Solution()
print(s.searchMatrix([
  [1,   3,  5,  7],
  [10, 11, 16, 20],
  [23, 30, 34, 50]
],13))
发布了333 篇原创文章 · 获赞 22 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_41687289/article/details/103652964