74.搜索二维矩阵 python

搜索二维矩阵

题目

题目描述

给你一个满足下述两条属性的 m x n 整数矩阵:

每行中的整数从左到右按非严格递增顺序排列。

每行的第一个整数大于前一行的最后一个整数。

给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。

示例 1:

输入:matrix = \[1,3,5,7,10,11,16,20,23,30,34,60], target = 3

输出:true

示例 2:

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

输出:false

提示:

m == matrix.length

n == matrixi.length

1 <= m, n <= 100

  • 1 0 4 10^4 104 <= matrixij, target <= 1 0 4 10^4 104

题解

思路分析

由于矩阵具有每行和每列都是有序的特点,可以将二维矩阵视为一个一维的有序数组。因此,我们可以使用二分查找来高效地定位目标值。

二分查找算法步骤

  1. 初始化边界 :设定二分查找的左右边界 leftright。初始时,left 为 0,rightm * n - 1(其中 m 是矩阵的行数,n 是矩阵的列数)。
  2. 计算中间位置 :在每次迭代中,计算中间位置 mid,并将该位置映射回二维矩阵中的坐标 (row, col)
  3. 比较中间值与目标值
    • 如果 matrix[row][col] == target,则找到了目标值,返回 true
    • 如果 matrix[row][col] < target,则说明目标值位于右侧部分,更新 left
    • 如果 matrix[row][col] > target,则说明目标值位于左侧部分,更新 right
  4. 循环结束条件 :当 left 超过 right 时,说明没有找到目标值,返回 false

Python 实现代码

python 复制代码
def searchMatrix(matrix, target):
    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
        elif mid_value < target:
            left = mid + 1
        else:
            right = mid - 1
            
    return False

代码解释

  1. 初始化边界left 设置为 0,right 设置为 m * n - 1,表示整个矩阵的范围。
  2. 计算中间位置 :通过 mid = (left + right) // 2 计算中间位置,并将其转换为二维矩阵中的坐标 (mid // n, mid % n)
  3. 比较中间值与目标值
    • 如果 matrix[mid // n][mid % n] == target,直接返回 true
    • 如果 matrix[mid // n][mid % n] < target,说明目标值在右侧,更新 left
    • 如果 matrix[mid // n][mid % n] > target,说明目标值在左侧,更新 right
  4. 循环结束条件 :当 left 大于 right 时,说明遍历完整个矩阵仍未找到目标值,返回 false

这种方法的时间复杂度为 O(log(m * n)),因为我们将二维矩阵视为一个一维的有序数组进行二分查找。空间复杂度为 O(1),因为我们只使用了常数级别的额外空间。

提交结果

相关推荐
Jerry15 小时前
LeetCode 454. 四数相加 II
算法
可编程芯片开发15 小时前
基于CPS-SPWM链式STATCOM系统在电压不平衡环境下控制策略的simulink建模与仿真
算法
2zcode16 小时前
基于MATLAB图像处理的饮料瓶灌装液位检测系统设计与实现
开发语言·图像处理·matlab
万亿少女的梦16816 小时前
基于Python的高考志愿填报辅助系统设计与实现
java·spring boot·python·mysql·vue
Jerry16 小时前
LeetCode 202. 快乐数
算法
hans汉斯16 小时前
基于改进交叉熵损失函数与Transformer的心电信号高风险分类研究
功能测试·深度学习·算法·yolo·目标检测·分类·transformer
Jerry16 小时前
LeetCode 349. 两个数组的交集
算法
必须得开心呀17 小时前
QT解决中文乱码问题
开发语言·qt
闲猫17 小时前
Python FastAPI + SQLAlchemy 入门教程:从零搭建你的第一个 Web 应用
前端·python·fastapi
fpcc17 小时前
数据结构—表
数据结构