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

python-leetcode 63.搜索二维矩阵

题目:

给一个满足两条属性的m*n的整数矩阵:

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

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

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


方法一:两次二分查找

由于每行的第一个元素大于前一行的最后一个元素,且每行元素是升序的,所以每行的第一个元素大于前一行的第一个元素,因此矩阵第一列的元素是升序的。

对矩阵的第一列元素二分查找,找到最后一个不大于目标值的元素,然后在该元素所在行中二分查找目标是否存在

class Solution(object):
    def searchMatrix(self, matrix, target):
        """
        :type matrix: List[List[int]]
        :type target: int
        :rtype: bool
        """
        row=bisect.bisect_right([row[0] for row in matrix],target)#用列表推导式获取所有行的第一个元素组成列表,返回的是第一个大于target的行首元素的位置
        if row==0: #如果row为0,表示所有行的第一个元素都大于target,矩阵中不可能存在该值
            return False
        target_row=matrix[row-1]#获取可能包含target的行(row-1位置的这一行)
        pos=bisect.bisect_left(target_row,target)#在目标行中使用bisect_left进行二分查找,找到target应该插入的位置
        return pos<len(target_row)and target_row[pos]==target#检查找到的位置是否有效且该位置的元素确实等于target

时间复杂度:O(logm+logn)=O(logmn),其中mn分别是矩阵的行数和列数

空间复杂度:O(1)


方法二:一次二分查找

若将矩阵每一行拼接在上一行的末尾,则会得到一个升序数组,我们可以在该数组上二分找到目标元素。

class Solution(object):
    def searchMatrix(self, matrix, target):
        """
        :type matrix: List[List[int]]
        :type target: int
        :rtype: bool
        """
        m, n = len(matrix), len(matrix[0])
        left, right = -1, m * n
        while left + 1 < right:
            mid = (left + right) // 2
            x = matrix[mid // n][mid % n]  #获取行列坐标
            if x == target:
                return True
            if x < target:
                left = mid
            else:
                right = mid
        return False

        

时间复杂度:O(logm+logn)=O(logmn),其中mn分别是矩阵的行数和列数

空间复杂度:O(1)

源自力扣官方题解和灵茶山艾府

 

http://www.dtcms.com/a/107646.html

相关文章:

  • JavaScript中Symbol详解及使用场景
  • c++:封装哈希表实现unordered_map与unordered_set
  • [dp_1] 使用最小花费爬楼梯 | 解码方法 | 虚拟dp[0]=0
  • 【输入某年某日,判断这是这一年的第几天】
  • 中小企业商标管理新选择:启服云。
  • Conmon lisp Demo
  • 如何在服务器里备份文件或系统
  • 基于NebulaGraph构建省市区乡镇街道知识图谱(二)
  • Bugku-眼见非实
  • 5.模型训练-毕设篇
  • HTML5手写签名板项目实战教程
  • linux -- php 扩展之xlswriter
  • DAY46 动态规划Ⅸ 股票问题Ⅱ
  • 机构数据服务
  • 搜索工具Everything下载安装使用教程(附安装包)
  • 网络安全的挑战与防护策略
  • Excel时间类型函数(包括today、date、eomonth、year、month、day、weekday、weeknum、datedif)
  • 大模型-提示词(Prompt)最佳实践
  • 【零基础入门unity游戏开发——2D篇】SpriteEditor图片编辑器
  • Unity 渲染流水线
  • 什么是编译和反编译
  • 【Python】Python 环境 + Pycharm 编译器 官网免费下载安装(图文教程,新手安装,Windows 10 系统)
  • 智能矢量化(地质类栅格图像)
  • python实战案例:销售数据BI动态分析仪表板
  • 今日行情明日机会——20250402
  • 任务堆积导致 OOM(内存溢出)
  • 08-MySQL InnoDB锁的基本类型
  • 【前端】电脑初始安装软件工具
  • 【Linux】内核驱动学习笔记(一)
  • 【论文笔记】DeepSeek-R1 技术报告