LeetCode 热题 100 74. 搜索二维矩阵

LeetCode 热题 100 | 74. 搜索二维矩阵

大家好,今天我们来解决一道经典的算法题------搜索二维矩阵 。这道题在 LeetCode 上被标记为中等难度,要求我们在一个满足特定条件的二维矩阵中查找一个目标值。如果目标值在矩阵中,返回 true;否则,返回 false。下面我将详细讲解解题思路,并附上 Python 代码实现。


问题描述

给定一个满足以下两个条件的 m x n 整数矩阵:

  1. 每行中的整数从左到右按非严格递增顺序排列。
  2. 每行的第一个整数大于前一行的最后一个整数。

你需要判断一个整数 target 是否在矩阵中。

示例 1:

plaintext 复制代码
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出:true

示例 2:

plaintext 复制代码
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
输出:false

解题思路

核心思想
  1. 二分查找:

    • 由于矩阵的每一行都是有序的,并且每行的第一个元素大于前一行的最后一个元素,整个矩阵可以看作是一个一维有序数组。
    • 因此,可以使用二分查找来高效地查找目标值。
  2. 映射二维索引到一维索引:

    • 将二维矩阵的索引映射到一维数组的索引,方便进行二分查找。

Python代码实现

python 复制代码
def searchMatrix(matrix, target):
    """
    :type matrix: List[List[int]]
    :type target: int
    :rtype: bool
    """
    if not matrix or not matrix[0]:
        return False

    m, n = len(matrix), len(matrix[0])  # 获取矩阵的行数和列数
    left, right = 0, m * n - 1  # 初始化二分查找的左右边界

    while left <= right:
        mid = (left + right) // 2  # 计算中间索引
        mid_value = matrix[mid // n][mid % n]  # 将一维索引映射到二维索引

        if mid_value == target:
            return True  # 找到目标值,返回 True
        elif mid_value < target:
            left = mid + 1  # 目标值在右侧,移动左边界
        else:
            right = mid - 1  # 目标值在左侧,移动右边界

    return False  # 未找到目标值,返回 False

# 测试示例
print(searchMatrix([[1,3,5,7],[10,11,16,20],[23,30,34,60]], 3))  # 输出: True
print(searchMatrix([[1,3,5,7],[10,11,16,20],[23,30,34,60]], 13))  # 输出: False

代码解析

  1. 初始化边界:

    • left 初始化为 0,right 初始化为矩阵的最后一个元素的索引 m * n - 1。
  2. 二分查找:

    • 在 left <= right 的范围内,计算中间索引 mid。
    • 将一维索引 mid 映射到二维索引 matrix[mid // n][mid % n]。
    • 如果 mid_value 等于目标值,直接返回 True。
    • 如果 mid_value 小于目标值,说明目标值在右侧,将 left 移动到 mid + 1。
    • 如果 mid_value 大于目标值,说明目标值在左侧,将 right 移动到 mid - 1。
  3. 返回结果:

    • 如果未找到目标值,循环结束后返回 False。

复杂度分析

  • 时间复杂度 :O(log(m * n)),其中 m 是矩阵的行数,n 是矩阵的列数。二分查找的时间复杂度为 O(log(m * n))。
  • 空间复杂度:O(1),只使用了常数个额外空间。

示例运行

示例 1
plaintext 复制代码
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出:true
示例 2
plaintext 复制代码
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
输出:false

总结

通过将二维矩阵的索引映射到一维索引,我们可以使用二分查找高效地查找目标值。这种方法不仅简洁,而且效率非常高,适合处理类似的问题。希望这篇题解对大家有所帮助,如果有任何问题,欢迎在评论区留言讨论!

关注我,获取更多算法题解和编程技巧!

相关推荐
微尘hjx1 小时前
【ByteTrack 04】多轨迹算法ByteTrack改进点
算法·yolo·目标检测·目标跟踪·bytetrack·ultralytics·车跟踪
小蒋观天下5 小时前
雷击与浪涌防护:前端SPD选型、接地网误区,接地不当反而引入干扰
深度学习·算法·机器学习
lvwangshu5 小时前
P15569 [COCI 2025/2026 #5] 结构 / Struktura 题解
矩阵·题解·dp·推导题·矩阵加速
WBluuue6 小时前
数据结构与算法:分块(一):块状数组、块状链表
数据结构·c++·算法·链表
圣保罗的大教堂6 小时前
leetcode 3619. 总价值可以被 K 整除的岛屿数目 中等
leetcode
澳鹏Appen7 小时前
澳鹏重磅发布ExamOCRBench:面向端到端试卷判分的多任务基准
算法·benchmark·基准评测
benjormin8 小时前
Java数据结构 二叉搜索树
数据结构·算法
人工智能培训8 小时前
知识图谱:结构化表达实体与关系的知识组织技术
大数据·人工智能·算法·重构·生活·知识图谱
地平线开发者8 小时前
QAT 实战:从 PyTorch 模型到 J6E 实板精度与延时验证
pytorch·算法·自动驾驶