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. 初始化边界 :设定二分查找的左右边界 left 和 right。初始时,left 为 0,right 为 m * 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),因为我们只使用了常数级别的额外空间。

提交结果

相关推荐
不会就选b2 小时前
算法日常・每日刷题--<贪心>25
数据结构·算法
杨杨杨大侠2 小时前
Jev、Kev、Laya:决策模型怎么选,什么时候需要微调?
人工智能·python·agent
andyweike2 小时前
php笔记
开发语言·笔记·php
LOVE️YOU3 小时前
Python 在定义函数时,究竟定义的是什么?
python
段一凡-华北理工大学3 小时前
大模型应用开发 100 天:Python + LLM 从入门到精通 day26~Prompt 调试与优化——A/B 测试与效果评估
windows·python·大模型·prompt·智能体·提示词工程·高炉智能化
Minecraft红客3 小时前
以撒的结合
python·游戏·电脑·娱乐
Circ.3 小时前
Python 调试 Litellm 本地大模型接口:模型列表与对话接口实操踩坑记录
开发语言·python
风早爽太4 小时前
用 ‌Render‌ 快速部署网站和常见问题解决
python·fastapi
现任明教教主~5 小时前
Thinkphp站群蜘蛛池SaaS系统YanyvSEO含多用户/积分/六大引擎计费/易支付对接
java·开发语言·spring
李航19835 小时前
给自己的图形引擎,配上了AI渲染,做设计真是太方便了
人工智能·python·计算机视觉·ai·ai编程