欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

74:搜索二维矩阵

程序员文章站 2022-05-20 13:47:01
...

问题描述

编写一个高效的算法来判断 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))
相关标签: leetcode中等题