当前位置: 首页 > article >正文

74.搜索二维矩阵 python

搜索二维矩阵

  • 题目
    • 题目描述
    • 示例 1:
    • 示例 2:
    • 提示:
  • 题解
    • 思路分析
    • 二分查找算法步骤
    • 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 == matrix[i].length
1 <= m, n <= 100
- 1 0 4 10^4 104 <= matrix[i][j], 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 实现代码

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),因为我们只使用了常数级别的额外空间。

提交结果

在这里插入图片描述


http://www.kler.cn/a/502223.html

相关文章:

  • 大数据技术Kafka详解 ⑤ | Kafka中的CAP机制
  • Oracle FLOOR函数的用法
  • 深度学习笔记11-优化器对比实验(Tensorflow)
  • 51单片机 和 STM32 的烧录方式和通信协议的区别
  • Julia语言的数据结构
  • 微调神经机器翻译模型全流程
  • HTTP 常用方法解析
  • CES Asia 2025:科技盛宴即将开启,续写辉煌篇章
  • 快速、简单的2D-6D位姿估计:Gen6D算法复现 (pytorch 1.12.1 + cu113)
  • <C++> XlsxWriter写EXCEL
  • redis——无锁的原子操作Lua
  • IOS网络协议HTTP
  • 备战蓝桥杯:树的存储与遍历(dfs和bfs)
  • lerna使用指南
  • Android中的Service
  • Docker的CMD指令
  • VMware虚拟机安装Home Assistant智能家居平台并实现远程访问保姆级教程
  • Android切换语言不退出App
  • 一个可以把玩的针对WebSocket分段的处理方案
  • 浅谈云计算07 | 云安全机制
  • 蓝桥杯历届真题 # 数字诗意(C++,Java)
  • React面试常见题目
  • C++中 为什么要把基类指针指向子类对象?
  • STM32 FreeRTOS的任务创建和删除
  • 2_CSS3 背景 --[CSS3 进阶之路]
  • vue集成导出 txt文本文档 和 excel文档 的方法