LeetCode-240. 搜索二维矩阵 II【数组 二分查找 分治 矩阵】

LeetCode-240. 搜索二维矩阵 II【数组 二分查找 分治 矩阵】

题目描述:

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

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

每列的元素从上到下升序排列。

示例 1:

输入:matrix = \[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

示例 2:

输入:matrix = \[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 = 20

输出:false

提示:

m == matrix.length

n == matrixi.length

1 <= n, m <= 300

-109 <= matrixij <= 109

每行的所有元素从左到右升序排列

每列的所有元素从上到下升序排列

-109 <= target <= 109

解题思路一:从左下角或者右上角元素出发,来寻找target。

如下图所示,我们将矩阵逆时针旋转 45° ,并将其转化为图形式,发现其类似于 二叉搜索树 ,即对于每个元素,其左分支元素更小、右分支元素更大。因此,通过从 "根节点" 开始搜索,遇到比 target 大的元素就向左,反之向右,即可找到目标值 target 。

"根节点" 对应的是矩阵的 "左下角" 和 "右上角" 元素,本文称之为 标志数 ,以 matrix 中的 左下角元素 为标志数 flag ,则有:

  1. 若 flag > target ,则 target 一定在 flag 所在 行的上方 ,即 flag 所在行可被消去。
  2. 若 flag < target ,则 target 一定在 flag 所在 列的右方 ,即 flag 所在列可被消去。

"右上角" 元素 也是类似

python 复制代码
class Solution:
    def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
        i, j = len(matrix) - 1, 0
        while i >= 0 and j < len(matrix[0]):
            if matrix[i][j] > target: 
                i -= 1
            elif matrix[i][j] < target:
                j += 1
            else:
                return True
        return False

时间复杂度:O(n+m)

空间复杂度:O(1)

解题思路二:右上角元素,代码

python 复制代码
class Solution:
    def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
        i, j = 0, len(matrix[0]) - 1
        while i < len(matrix) and j >= 0:
            if matrix[i][j] > target:
                j -= 1
            elif matrix[i][j] < target:
                i += 1
            else:
                return True
        return False

时间复杂度:O(n+m)

空间复杂度:O(1)

解题思路三:暴力也能过

python 复制代码
class Solution:
    def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
        for row in matrix:
            for element in row:
                if element == target:
                    return True
        return False

时间复杂度:O(nm)

空间复杂度:O(1)

解题思路四:二分查找

python 复制代码
class Solution:
    def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
        for row in matrix:
            idx = bisect.bisect_left(row, target)
            if idx < len(row) and row[idx] == target:
                return True
        return False

时间复杂度:O(mlogn)

空间复杂度:O(1)

相关推荐
YuK.W2 分钟前
Leetcode100: 94.二叉树中序遍历、104.二叉树最大深度、226.翻转二叉树
java·算法·leetcode·二叉树
气泡音人声分离1 小时前
技术解析|均衡器(EQ)工作原理与实操指南:从频率拆分到听感优化
算法·均衡器·音频剪辑
weixin_413063211 小时前
复现 MatchED 边缘检测模型(单张图片重复8次,训练200 epoch)
python·算法·计算机视觉·边缘检测模型
2601_962440841 小时前
计算机毕业设计之jsp教室管理系统
java·开发语言·笔记·分布式·算法·课程设计·推荐算法
AI视频剪辑官1 小时前
播客切片工具选型核心评价维度
网络·人工智能·算法
复杂网络4 小时前
AI 不睡觉,但它比你更会做实验
算法
贵慜_Derek4 小时前
MAI-04|干净数据在工程上意味着什么:MAI 预训练数据治理
人工智能·算法·llm
棒球1号位5 小时前
《棒球1号位矩阵联盟:江西青少年棒球基地建设的破局之道》
线性代数·矩阵
会博通·代码搬运工6 小时前
会博通数字化智能工作站(龟仔家族):产品矩阵、部署架构与技术选型指南
运维·数据库·线性代数·矩阵·架构·api集成·电子档案合规