【剑指offer】二维数组中的查找(详细解析)

news2024/11/18 13:48:47

文章目录

  • 题目
  • 思路
  • 代码实现


题目

题目链接入口:牛客:JZ4 二维数组中的查找
在这里插入图片描述

在这里插入图片描述

思路

1.核心考点

(1) 数组相关:二维数组(矩阵)。
(2) 特性观察:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。
(3) 时间复杂度的把握:O(m+n),遍历矩阵的时候,最多经过矩阵的一行一列。
(4) 空间复杂度的把握:O(1),常数级变量,无额外辅助空间。
2.解题思路

  1. 查找的过程,本质是排除的过程。那么一次排除一个和一次排除一批,当然是后者的效率更高。暴力查找算法,即遍历整个二维矩阵,是一次排除一个的做法,可以解决这个问题,但是效率低,并且没有利用到题目给出的特性,所以不介意这种做法。
  2. 下面给出了一个矩阵样式的图,我们以这个矩阵为例。通过观察,右上角的元素4,是它这一行的最大值,是它这一列的最小值;或者左下角的元素3,是它这一行的最小值,是它这一列的最大值。这是解决这道题的关键突破口
    在这里插入图片描述
    3.如何解决?
    如果要找的值小于右上角(4),则排除这一列(排除了4,5,6),因为右上角的值是这一列最小的,如果我们要找的值还小于4,那么肯定不在这一列;

如果我们要找的值大于右上角,则排除这一行(排除了1,2,3,4),因为右上角元素是这一行最大的,如果我们要找的值还大于4,那么肯定不在这一行。

4.排除一行,或一列后,剩下的元素还是一个二维数组,所以我们可以复用这个方法。

5.临界条件:i表示行,j表示列。以右上角为基准值,保证i,j在二维数组的合法范围即可。

6.总结:这种方法,一次可以排除一行,或者一列,相比暴力查找算法(一次只排除一个),效率高太多了,还有比如二分查找算法,它是一次可以排除一半,当然它的条件是有序,所以它的效率也超高。

代码实现

C++版本:

class Solution {
public:
    bool Find(int target, vector<vector<int> > array) {
        //我们以最右上角的元素为例
        int i=0;
        int j=array[0].size()-1;

        //临界条件
        while(i<array.size()&&j>=0)
        {
            if(target<array[i][j])array[i][j]一定是当前行最大的,当前列最小的
            {
                j--;//排除这一列
            }
            else if(target>array[i][j])
            {
                i++;//排除这一行
            }
            else {
                //找到了
                return true;
            }
        }
        return false;
    }
};

java版本:

public class Solution {
    public boolean Find(int target, int [][] array) {
        if (array == null) {
            return false;
        }
        int i = 0;
        int j = array[0].length - 1;
        while ( i < array.length && j >= 0) {
            if (target <array[i][j]) { //array[i][j]一定是当前行最大的,当前列最小的
                //target < array[i][j] 排除当前列
                j--;
            }
            else if (target > array[i][j]) {
                //target > array[i][j] 排除当前行
                i++;
                
            }
            else {
                //找到
                return true;
            }
        }
        return false;
    }
}

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

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

相关文章

如何使用宝塔面板搭建网站(最后一步!上传文件至宝塔面板)

这里就是我们搭建宝塔面板的最后一步了&#xff0c;把我们的PHP文件上传到宝塔面板上&#xff0c;就可以通过因特尔网络访问我们的网址了。 第一步&#xff1a;基础安装 必须是Linux服务器 不支持window服务器 最低要求配置1核1G当然再低些也能运行但是不建议 要求服务器环…

值得收藏 | 脑机交互作用研究

神经损伤和疾病对许多人的生活产生了巨大的影响&#xff0c;导致了许多运动障碍和日常任务无法独立完成。皮质假体系统通过脑机接口&#xff08;BCI&#xff09;接收一个动作命令来执行所需的位置&#xff0c;从而使得经历神经损伤的人能够实现部分功能恢复。BCI技术可以在侵入…

chatgpt赋能python:Python创建二维列表的方法

Python创建二维列表的方法 Python是一种高级编程语言&#xff0c;它的灵活性和功能强大的库使其成为数据科学和机器学习的最佳工具之一。其中一个常用的数据结构是二维列表&#xff0c;本文将介绍如何在Python中创建一个二维列表。 什么是二维列表&#xff1f; 在Python中&a…

华为OD机试真题 Java 实现【表示数字】【牛客练习题】

一、题目描述 将一个字符串中所有的整数前后加上符号“*”&#xff0c;其他字符保持不变。连续的数字视为一个整数。 数据范围&#xff1a;字符串长度满足1≤n≤100 。 二、输入描述 输入一个字符串。 三、输出描述 字符中所有出现的数字前后加上符号“*”&#xff0c;其…

arcgis for javascript中的TileLayer(缓存地图服务图层)

一、什么是图层 要理解TileLayer图层&#xff0c;咱要先搞清楚在arcgis中图层的概念&#xff1a; ArcGIS for JavaScript中的图层是数据的可视化链接。简单来说&#xff0c;它可以将数据显示在地图上。 图层是地图上的一个图形单元&#xff0c;可以是点、线、面、文本等&#…

复杂的HANASQL 列表转多行

一 前言 基于HANA的内存数据库的强大性能, SAP建议把业务逻辑下沉到HANA中计算.以便减少应用服务器的负担,让程序性能更好一些. SAP本身的一些复杂的业务逻辑比如MRP运算(MD01)也有了新的事务 MD01N (MRP LIVE),性能得以巨大的提升 报表类的数据分析程序尤其适用此原则. 动态报…

淘宝监控竞品sku数据接口

电商竞品数据监控查询可以通过以下几个步骤实现&#xff1a; 确定需要监控的竞品&#xff1a;首先需要明确自己店铺的产品定位和竞争对手&#xff0c;选择需要监控的竞品。 选择监控工具&#xff1a;根据需求和预算选择适合自己的电商竞品数据监控工具&#xff0c;例如谷歌分析…

nvm管理node的多版本,任意安装,切换不同nodejs版本

1.nvm安装包下载&#xff1a; https://github.com/coreybutler/nvm-windows/releases window操作系统选择安装包直接安装&#xff1a; 如果已经在使用的nodejs无需卸载&#xff0c;安装过程中会提示是否需要管理已经安装的版本&#xff0c;选择“是”。 2.安装完成之后&…

云计算——云计算部署形成及应用

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​ 目录 前言 一.云计算部署形式 1.私有云 &#xff08;1&#xff09;私有云优点 &#x…

计划

img { margin: auto; display: block } 优化器的作用是什么&#xff1f;例举一下神经网络中常用的优化器&#xff1f; 优化器作用&#xff1a;求出让损失函数最小化的参数。 常用优化器&#xff1a; 1、Adam 关联所有样本的梯度&#xff0c;便于求解全局最优解&#xff0c;始终…

有公网IP,如何设置端口映射实现访问?

很多中小型公司或个人会根据自身需求自建服务器&#xff0c;或者将自己内网的服务、应用发布到外网&#xff0c;实现异地访问&#xff0c;如远程桌面、网站、数据库、公司的管理系统、FTP、管家婆、监控系统等等。 没接触过的人可能会觉得这个很难&#xff0c;实际上使用快解析…

国内镜像+JDK下载地址+IDEA专业安装版和免安装版下载地址

一、OracleJDK下载地址 JDK版本Oracle JDK新增特性官网原版下载地址JDK 1.0-已下线JDK 1.1-已下线JDK 1.2-已下线JDK 1.3-已下线JDK 1.4-已下线JDK 5.0自动装箱、泛型、枚举、增强的for循环、注解等已下线JDK 6JDBC 4.0、Pluggable Annotation Processing API、JAX-WS、StAX等…

Redis底层学习(六)—存储类型-ZSet篇

这里写目录标题 结构特点具体服务器操作命令底层结构应用场景 结构特点 适⽤场景&#xff1a;存储不重复且有序需求的数据&#xff0c;⽐如&#xff1a;学⽣的⾼考成绩。 它的内部采⽤“ 跳跃列表 ”实现&#xff0c;根据score进⾏排序 具体服务器操作命令 添加元素到zset中…

RedditVideoMakerBot 视频制作机器人自动生成视频搭建教程

https://github.com/elebumm/RedditVideoMakerBot搭建教程 RedditVideoMakerBot视频制作机器人 有些在抖音、快手上的视频获得了数百万的观看次数&#xff0c;你仔细分析他们的视频&#xff0c;他们唯一做的原创事情收集材料、然后拼接在一起。尤其是一些新闻类的视频&#xff…

深度学习-RepVGGNet

文章目录 前言一、RepVgg简介二、为什么训练时采用多分支结构三、为什么推理时使用单分支结构四、结构重参数化1、融合Conv2d和BN 前言 看yolonas代码&#xff0c;发现有QARepVgg网络&#xff0c;完全不懂&#xff0c;所以来补课&#xff0c;先看了RepVGG 这篇文章主要来自于霹…

模六十计数器(三)

文章目录 前言一、代码模板二、Verilog程序1、顶层模块2、计数模块3、显示模块 三、Testbench程序四、仿真波形五、实测结果总结 前言 又隔了将近一年&#xff0c;学习明德扬编程规范&#xff0c;重新编写模六十计数器程序&#xff0c;使其符合规范&#xff0c;并采用模板化与…

阿秀去面腾讯了(社招两年面试经验)

作者&#xff1a;阿秀 校招八股文学习网站&#xff1a;https://interviewguide.cn 小伙伴们大家好&#xff0c;我是阿秀。 前段时间说了自己换工作的事&#xff1a;阿秀离职了&#xff0c;虽然最后选择去了外企&#xff0c;但在换工作期间也看了不少机会&#xff0c;基本国内的…

独立开发变现周刊(第89期):一个 AI 小工具,两个月内赚7.3万美元

分享独立开发、产品变现相关内容&#xff0c;每周五发布。 目录 1、privateGPT: 可以和本地文档进行交互的聊天机器人2、chatbutler: 无代码可视化创建聊天机器人3、CommaFeed&#xff1a;可以自托管RSS阅读器开源项目4、roop: 一键深度换脸5、deeplearning: 吴恩达在推特上宣布…

搜索帮助demo:F4IF_INT_TABLE_VALUE_REQUEST 返回多列值

货铺QQ群号&#xff1a;834508274微信群不能扫码进了&#xff0c;可以加我微信SAPliumeng拉进群&#xff0c;申请时请提供您哪个模块顾问&#xff0c;否则是一律不通过的。进群统一修改群名片&#xff0c;例如BJ_ABAP_森林木。群内禁止发广告及其他一切无关链接&#xff0c;小程…

零基础开发小程序第三课-列表功能开发

最近我新研究了一款无代码开发工具&#xff0c;主打的是一行代码都不写来开发小程序。已经有了两篇文章 利用无代码工具开发一款小程序 公民开发者学习无代码编程&#xff0c;从CRUD开始 前两篇文章已经介绍了如何创建项目&#xff0c;如何建立数据表&#xff0c;以及开发新…