搜索二维矩阵——力扣74

news2025/1/11 21:50:52

文章目录

    • 题目描述
    • 法一)一次二分查找
    • 法二)两次二分查找
    • 法三)抽象二叉搜索树BST解法

题目描述

在这里插入图片描述
在这里插入图片描述

法一)一次二分查找

首先分析题目:由于①每行的整数从左到右升序;②每行的第一个整数>前一行的最后一个整数,所以,

  • 按矩阵每行拆分后,每行拼接在前一行的末尾,会得到一个升序数组
  • 在得到的数组上进行二分查找
  • 二分升序数组的下标,将其映射到矩阵的行和列上
class Solution{
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target){
        int m=matrix.size(), n=matrix[0].size();   //matrix.size()表示行数  matrix[0].size()表示列数
        int l=0, r=m*n-1;                          //二分的是数组的下标
        while(l<=r){
            int mid=(r-l)/2 + l;
            int x = matrix[mid/n][mid%n];          //mid/n表示第几行,mid%n表示第几列
            if(x<target){
                l=mid+1;
            }
            else if (x>target){
                r=mid-1;
            }
            else{
                return true;
            }
        }
        return false;
    }
};

复杂度分析

  • 时间复杂度O(log mn),其中m、n分别是矩阵的行数和列数
  • 空间复杂度O(1)

法二)两次二分查找

由于①每行的第一个元素大于前一行的最后一个元素,②每行元素是升序的,所以

  • 每行的第一个元素大于前一行的第一个元素,因此矩阵第一列的元素是升序的。
  • 对矩阵的第一列的元素二分查找,找到最后一个不大于目标值的元素,然后在该元素所在行中二分查找目标值是否存在。
class Solution{
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target){
        int m=matrix.size(), n=matrix[0].size();
        //第一次二分:定位到所在行
        int l=0, r=m-1;
        while(l<r){
            int mid=(l+r+1) >> 1;          //必须+1,否则容易死循环
            if(matrix[mid][0]<=target){
                l=mid;
            } else {
                r = mid-1;
            }
        }
        int row=r;
        if(matrix[r][0]==target) return true;
        if(matrix[r][0]>target)  return false;

        //第二次二分:定位所在列
        l=0, r=n-1;
        while(l<r){
            int mid=(l+r+1) >> 1;  
            if(matrix[row][mid]<=target){
                l=mid;
            }
            else {
                r=mid-1;
            }
        }
        int col=r;
        return matrix[row][col]==target;
    }
};

值得注意的是,二分法那里如果不加1会出现死循环,比如 l= 1, r = 2的时候,如果不加1,在满足l = mid的情况下,会一直死循环!

复杂度

  • 时间复杂度O(log mn)
  • 空间复杂度O(1)

法三)抽象二叉搜索树BST解法

将二维矩阵抽象成「以右上角为根的 BST」
在这里插入图片描述
从根(右上角)开始搜索,如果当前的节点不等于目标值,可以按照树的搜索顺序进行:

  • 当前节点「大于」目标值,搜索当前节点的「左子树」,也就是当前矩阵位置的「左方格子」,即 j–
  • 当前节点「小于」目标值,搜索当前节点的「右子树」,也就是当前矩阵位置的「下方格子」,即 i++
class Solution{
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target){
        int m=matrix.size(), n=matrix[0].size();
        for(int i=0, j=n-1;i<m & j>=0;){
            if(matrix[i][j]==target)
                return true;
            else if (matrix[i][j] > target)
                j--;
            else if(matrix[i][j] < target)
                i++;
        }
        return false;
    }
};

复杂度

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/558436.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AC和AP和STA信息查询

AC和AP和STA信息查询 1、AC的运行统计信息1.1、查看设备的部件类型及状态信息 2、AP的运行统计信息2.1、AP的运行信息 / 查看RU的运行信息2.2、AP性能统计信息2.3、AP的射频信息2.4、AP重启失败的记录2.5、非法AP的存在情况2.6、设备信道切换的记录信息2.7、查看指定AP射频上的…

自助式数据分析工具:jvs-sdw(数据智仓)图表配置说明和实现效果

图表的查询条件配置示例说明 在JVS数据分析图表中&#xff0c;是支持查询条件进行多个数据展示组件的联动查询&#xff0c;实现的方式是设置统一的查询条件&#xff0c;在每个图表组件中&#xff0c;设置对应的查询字段去关联查询条件&#xff0c;那么下面我们逐步介绍配置方式…

CMOS摄像头驱动分析

CMOS摄像头驱动分析 文章目录 CMOS摄像头驱动分析ov2640_probe_dt从设备树中获取ov2640的GPIO引脚并进行初始化v4l2_i2c_subdev_init初始化v4l2子设备v4l2_ctrl_new_std添加vflip控制器 ov2640_probe_dt从设备树中获取ov2640的GPIO引脚并进行初始化 ov2640_probe_dt从设备树中…

设计模式剖析,授之以渔(java代码)

创建型模式 简单工厂模式 public class FoodFactory {public static Food makeFood(String name) {if (name.equals("noodle")) {Food noodle new LanZhouNoodle();noodle.addSpicy("more");return noodle;} else if (name.equals("chicken")…

【论文阅读笔记】BaFFLe: Backdoor Detection via Feedback-based Federated Learning

个人阅读笔记&#xff0c;如有错误欢迎指出 会议&#xff1a;2021 IEEE 41st International Conference on Distributed Computing Systems (ICDCS) BaFFLe: Backdoor Detection via Feedback-based Federated Learning | IEEE Conference Publication | IEEE Xplore 问题&am…

泰克(Tektronix) TCP305A电流探头TCPA300电流放大器

泰克Tektronix TCP305ATCPA300电流放大器 泰克 TCP305 电流探头是一种同时使用变压器和霍尔效应技术的分芯式探头。当通过 TEKPROBE Level II、TekConnect&#xff08;带 TCA-BNC&#xff09;或 TekVPI&#xff08;带 TPA-BNC&#xff09;接口连接到泰克示波器时&#xff0c;泰…

GPU服务器安装Anaconda

1.下载Anaconda安装包&#xff0c;官网地址&#xff0c;清华源地址。 在官网下载到本地之后&#xff0c;可以通过文件传输上传安装包到服务器&#xff0c;使用清华源地址可以直接使用wget下载所需版本&#xff0c;例如&#xff1a; wget https://mirrors.tuna.tsinghua.edu.c…

Hibernate 快速入门

Hibernate 快速入门 〇、前言一、搭建 Hibernate 项目步骤1:新建 Java 项目附录1:新建Java项目中的相关文件信息步骤2:添加 Hibernate 框架支持附录2:添加Hibernate框架支持后,Java项目中的相关文件信息步骤3:其他关键配置1、添加数据库驱动包(本文以MySQL为例)2、配置…

详解C语言assert宏

前言&#xff1a;我们经常在写代码时&#xff0c;发现一些大牛的代码中总有一句assert&#xff08;表达式&#xff09;&#xff0c;经过在网上的学习&#xff0c;笔者也浅显的了解了assert的相关知识&#xff0c;assert一般用于规范代码&#xff0c;避免不必要的错误&#xff0…

【Linux高级 I/O(5)】初识存储映射 I/O——mmap()和 munmap()(附代码示例)

存储映射 I/O 存储映射 I/O&#xff08;memory-mapped I/O&#xff09;是一种基于内存区域的高级 I/O 操作&#xff0c;它能将一个文件映射到进程地址空间中的一块内存区域中&#xff0c;当从这段内存中读数据时&#xff0c;就相当于读文件中的数据&#xff08;对文件进…

【数据库系统设计栗子】——图书借阅简单设计

图书借阅简单设计&#x1f60e; 前言&#x1f64c;需求分析——数据结构1.1图书信息1.2 书库信息1.3 图书库存信息1.4 用户1.5 借阅1.6 借阅记录概念模型E-R图 逻辑模型 总结撒花&#x1f49e; &#x1f60e;博客昵称&#xff1a;博客小梦 &#x1f60a;最喜欢的座右铭&#xf…

“三化”引领潮流,时尚代名词

大家好&#xff01;我是微三云小鱼&#xff01; 下面给大家分享一下“潮流文化” 如今越来越多的企业都在向数字化前进 而且也相信数字化代表着 向上、未来还是时尚&#xff0c; 各个企业都希望通过数字化 改变现代管理理念。 希望 像打开云计算一样拓展 另外一个渠道。 除了数…

Redis存在线程安全问题吗?让我们来谈谈!

大家好&#xff0c;我是你们的小米。在之前的文章中&#xff0c;我们谈到了Redis存在的线程安全问题。今天&#xff0c;我将以一个电商项目的实际案例来演示&#xff0c;为大家详细解析Redis线程安全问题的原因&#xff0c;并分享一些具体的解决措施。 为什么存在线程安全问题&…

Java程序设计入门教程--物体的抽象过程

类的概念 面向对象的思想来源于对客观世界的认知。 现实的世界是缤纷复杂、种类繁多&#xff0c;难于认识和理解的&#xff0c;但聪明的人们学会了把这些错综复杂的事物进行分类&#xff0c;从而使世界变得井井有条。比如我们由各式各样的汽车抽象出汽车的概念&#xf…

chatgpt赋能Python-python_label颜色

Python Label 颜色的重要性 在Python编程中&#xff0c;我们经常会使用Label来表示文本标签&#xff0c;并且经常需要为这些标签创建不同的颜色&#xff0c;以区分和凸显关键信息。正确选择和使用标签颜色将有助于提高代码的可读性和可维护性&#xff0c;并且在应用程序和Web开…

云渲染时能否关机或断网?

先说一下云渲染&#xff1a; 基于渲染农场&#xff0c;用户可以将自己制作好的文件打包&#xff0c;通过云渲染客户端将打包文件上传到云渲染的服务器进行渲染。以下是 云渲染中能否关电脑的相关回答&#xff1a; 1.提交、上传文件时可以关电脑吗&#xff1f; 不能。文件提交是…

【敬伟ps教程】颜色和图案的填充

文章目录 油漆桶工具填充命令前景色内容识别图案历史记录黑白灰 渐变图层样式填充填充图层 油漆桶工具 油漆桶工具可以填充前景色和图案&#xff0c;快捷键 G 选好前景色&#xff0c;点击画布&#xff0c;画布就会被填充前景色&#xff1b; 建立选区后&#xff0c;填充会在选…

迅为龙芯2K1000开发板国产处理器操作系统

1、硬件配置 国产龙芯处理器&#xff0c;双核64位系统&#xff0c;板载2GDDR3内存&#xff0c;流畅运行Busybox、Buildroot、Loognix、QT5.12 系统! 2、接口全 板载4路USB HOST、2路千兆以太网、2路UART、2路CAN总线、Mini PCIE、SATA固态盘接口、4G接口、GPS接口WIFI、蓝牙…

算法27:从暴力递归到动态规划(1)

题目&#xff1a;已知数列的规则为 1 1 2 3 5 8 13 21 ..... * 按照这种规则&#xff0c;求第n项, n > 2. 这是典型的斐波拉切数列, 公式为 F(n)F(n - 1)F(n - 2) 那么就可以推导出 F(n)F(n - 1) F(n - 2) F(n-1)F(n - 2) F(n - 3) F(n-2)F(n - 3) F(n - 4) F(3)F(n -…

Spring Boot 如何处理国际化

Spring Boot 国际化 在全球化的今天&#xff0c;很多应用程序需要支持多种语言和地区。为了满足不同用户的需求&#xff0c;应用程序需要提供多语言的支持。Spring Boot 提供了强大的国际化支持&#xff0c;使得开发人员能够轻松地为应用程序添加多语言支持。本文将介绍如何使…