LeetCode-240. 搜索二维矩阵 II【数组 二分查找 分治 矩阵】

news/2024/6/16 23:59:26 标签: leetcode, 矩阵, 算法, 二分查找, 分治

LeetCode-240. 搜索二维矩阵 II【数组 二分查找 分治 矩阵

  • 题目描述:
  • 解题思路一:从左下角或者右上角元素出发,来寻找target。
  • 解题思路二:右上角元素,代码
  • 解题思路三:暴力也能过
  • 解题思路四:二分查找

题目描述:

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:

每行的元素从左到右升序排列。
每列的元素从上到下升序排列。

示例 1:
在这里插入图片描述
输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5
输出:true
示例 2:
在这里插入图片描述
输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 20
输出:false

提示:

m == matrix.length
n == matrix[i].length
1 <= n, m <= 300
-109 <= matrix[i][j] <= 109
每行的所有元素从左到右升序排列
每列的所有元素从上到下升序排列
-109 <= target <= 109

解题思路一:从左下角或者右上角元素出发,来寻找target。

如下图所示,我们将矩阵逆时针旋转 45° ,并将其转化为图形式,发现其类似于 二叉搜索树 ,即对于每个元素,其左分支元素更小、右分支元素更大。因此,通过从 “根节点” 开始搜索,遇到比 target 大的元素就向左,反之向右,即可找到目标值 target 。
在这里插入图片描述

“根节点” 对应的是矩阵的 “左下角” 和 “右上角” 元素,本文称之为 标志数 ,以 matrix 中的 左下角元素 为标志数 flag ,则有:

  1. 若 flag > target ,则 target 一定在 flag 所在 行的上方 ,即 flag 所在行可被消去。
  2. 若 flag < target ,则 target 一定在 flag 所在 列的右方 ,即 flag 所在列可被消去。

“右上角” 元素 也是类似

class Solution:
    def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
        i, j = len(matrix) - 1, 0
        while i >= 0 and j < len(matrix[0]):
            if matrix[i][j] > target: 
                i -= 1
            elif matrix[i][j] < target:
                j += 1
            else:
                return True
        return False

时间复杂度:O(n+m)
空间复杂度:O(1)

解题思路二:右上角元素,代码

class Solution:
    def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
        i, j = 0, len(matrix[0]) - 1
        while i < len(matrix) and j >= 0:
            if matrix[i][j] > target:
                j -= 1
            elif matrix[i][j] < target:
                i += 1
            else:
                return True
        return False

时间复杂度:O(n+m)
空间复杂度:O(1)

解题思路三:暴力也能过

class Solution:
    def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
        for row in matrix:
            for element in row:
                if element == target:
                    return True
        return False

时间复杂度:O(nm)
空间复杂度:O(1)

解题思路四:二分查找

class Solution:
    def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
        for row in matrix:
            idx = bisect.bisect_left(row, target)
            if idx < len(row) and row[idx] == target:
                return True
        return False

时间复杂度:O(mlogn)
空间复杂度:O(1)


http://www.niftyadmin.cn/n/5464787.html

相关文章

(九)Docker的认识

1.初识Docker 1.1.什么是Docker 微服务虽然具备各种各样的优势&#xff0c;但服务的拆分通用给部署带来了很大的麻烦。 分布式系统中&#xff0c;依赖的组件非常多&#xff0c;不同组件之间部署时往往会产生一些冲突。在数百上千台服务中重复部署&#xff0c;环境不一定一致…

ubuntu 22.04安装Anaconda3步骤

系统&#xff1a;Ubuntu 22.04 目标&#xff1a;安装Anaconda3 步骤&#xff1a; 1.在Anaconda官网 link下载xx.sh文件 2.进入Download文件夹&#xff0c;添加文件执行权限 chmod x Anaconda_xxx.sh 3.运行 ./Anaconda_xxx.sh 4.确定当前安装路径,一般为如下形式 /home/usr-nam…

华为ensp中ospf多区域管理 原理及配置命令(详解)

作者主页&#xff1a;点击&#xff01; ENSP专栏&#xff1a;点击&#xff01; ————前言———— OSPF 多区域的主要作用是缩小链路状态数据库和路由表的规模&#xff0c;减少路由更新的频率&#xff0c;提高网络的可扩展性&#xff0c;实现路由过滤和路由汇总&#xff0…

OpenCV中的模块:三维重建-SFM

运动中恢复结构&#xff08;SFM&#xff09;可以用来重建目标的稀疏点云并为后续的稠密重建提供相对精度更高的种子点&#xff0c;也可以用于里程计等估计相机本身的位姿。同样&#xff0c;除了采用结构光进行三维重建外&#xff0c;还用到了OpenMVG C/PMVS和COLMAP。在浏览Op…

旋转图像 - LeetCode 热题 20

大家好&#xff01;我是曾续缘&#x1f496; 今天是《LeetCode 热题 100》系列 发车第 20 天 矩阵第 3 题 ❤️点赞 &#x1f44d; 收藏 ⭐再看&#xff0c;养成习惯 旋转图像 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转…

Java基础入门--面向对象课后题(2)

文章目录 1 Employee2 SalariedEmployee3 HourlyEmployee4 SalesEmployee5 BasePlusSalesEmployee6 测试类 Example177 完整代码 某公司的雇员分为5类&#xff0c;每类员工都有相应的封装类&#xff0c;这5个类的信息如下所示。 (1) Employee&#xff1a;这是所有员工总的父类。…

如何评估基于指令微调的视觉语言模型的各项能力-MMBench论文解读

1. 传统基准的固有局限 VQAv2:视觉问题回答数据集,主要用于评估视觉理解与推理能力。COCO Caption:图像描述生成数据集,用于评估模型对图像内容的理解与描述能力。GQA:结合常识的视觉问题回答数据集。OK-VQA:需要外部知识的视觉问题回答数据集。TextVQA:图像中包含文本的…