二维数组中的查找

img

😀前言
在解决问题时,我们经常会遇到需要在二维数组中查找特定元素的情况。然而,如果直接使用暴力搜索,即遍历整个数组寻找目标元素,可能会导致时间复杂度较高,效率不高。然而,对于给定的二维数组,如果我们能够利用其特殊的排序性质,就有可能实现更高效的查找算法。

🏠个人主页:尘觉主页

文章目录

  • 二维数组中的查找
    • 题目链接
    • 题目描述
    • 解题思路
    • 思路分析
    • 😄总结

二维数组中的查找

题目链接

牛客网

题目描述

给定一个二维数组,其每一行从左到右递增排序,从上到下也是递增排序。给定一个数,判断这个数是否在该二维数组中。

Consider the following 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]
]

Given target = 5, return true.
Given target = 20, return false.

解题思路

要求时间复杂度 O(M + N),空间复杂度 O(1)。其中 M 为行数,N 为 列数。

该二维数组中的一个数,小于它的数一定在其左边,大于它的数一定在其下边。因此,从右上角开始查找,就可以根据 target 和当前元素的大小关系来快速地缩小查找区间,每次减少一行或者一列的元素。当前元素的查找区间为左下角的所有元素。

35a8c711-0dc0-4613-95f3-be96c6c6e104

public boolean Find(int target, int[][] matrix) {
    if (matrix == null || matrix.length == 0 || matrix[0].length == 0)
        return false;
    int rows = matrix.length, cols = matrix[0].length;
    int r = 0, c = cols - 1; // 从右上角开始
    while (r <= rows - 1 && c >= 0) {
        if (target == matrix[r][c])
            return true;
        else if (target > matrix[r][c])
            r++;
        else
            c--;
    }
    return false;
}

思路分析

首先,我们观察到这样一个规律:对于二维数组中的任意一个数,它位于当前行的最右边、当前列的最上方。根据这个规律,我们可以将整个查找过程看作是从矩阵的右上角开始逐步移动,根据目标值与当前元素的大小关系,决定是向左移动一列,还是向下移动一行,直到找到目标值或者遍历完整个数组。

具体算法步骤如下:

首先,我们对输入进行异常情况的处理。如果输入的二维数组为空或者行列数为0,则直接返回false,表示不存在目标值。

然后,我们初始化两个指针r和c,分别指向矩阵的右上角元素。初始时,r指向第一行,c指向最后一列。

进入循环,循环条件为r小于行数且c大于等于0。这是因为如果r越界,则说明已经遍历完所有行;如果c越界,则说明已经遍历完所有列。

在循环中,我们首先检查当前指向的元素是否等于目标值。如果等于,则直接返回true,表示目标值存在于二维数组中。

如果当前元素不等于目标值,我们根据当前元素与目标值的大小关系决定移动指针。如果目标值大于当前元素,则说明目标值应该在当前元素的下方,因此将指针r向下移动一行;如果目标值小于当前元素,则说明目标值应该在当前元素的左边,因此将指针c向左移动一列。

循环结束后,如果仍然没有找到目标值,则返回false,表示目标值不存在于二维数组中。

这样,通过每次将查找区间缩小一行或者一列的方式,我们可以在时间复杂度为O(M + N)的情况下,高效地判断目标值是否存在于二维数组中。

😄总结

通过本文介绍的方法,我们可以在给定的二维数组中高效地查找目标元素。利用该二维数组的特殊排序性质,我们可以从右上角开始查找,根据目标元素与当前元素的大小关系,逐步缩小查找范围,直至找到目标元素或者确定其不存在于数组中。这种算法的时间复杂度为 O(M + N),空间复杂度为 O(1),具有很高的效率和实用性。因此,在解决类似问题时,我们可以考虑利用数组的特殊性质,设计出更加高效的算法,从而提升程序的性能。

😁热门专栏推荐
想学习vue的可以看看这个

java基础合集

数据库合集

redis合集

nginx合集

linux合集

手写机制

微服务组件

spring_尘觉

springMVC

mybits

等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持

🤔欢迎大家加入我的社区 尘觉社区

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

img

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

将Composite Collider 2D组件移除可解决Unity穿墙问题

将Composite Collider 2D组件移除可解决Unity穿墙问题

HTTP/UDP/TCP/IP网络协议

文章目录 计算机网络基础HTTP相关问题 UDPTCP连接管理(三次握手/四次挥手)TCP可靠传输(确认答应)超时重传滑动窗口流量控制拥塞控制延时应答捎带应答粘包问题其他 IP数据链路层MUT 网卡接收数据流程相关问题TCP会粘包、UDP永远不会粘包 学习博客 计算机网络基础 OSI模型定义了…

vue3 路由允许通过跳转访问,不允许通过空白页访问,同时通过路由跳转来的刷新不会丢失

背景说明 需要是这样的&#xff1a; 假设这个路由是/aa 它可以通过其它路由跳转进入 或 访问路由标签进入。如&#xff1a;通过路由/bb跳转进入到路由/aa&#xff1a;在路由/bb中写如下代码router.push({ path: /aa })不允许通过空白页进入。如 由路由/bb跳转到路由/aa后&am…

Oracle数据库imp文件导入失败提示:“不是有效的导出文件, 标头验证失败”解决方法

导入数据库时&#xff0c;直接提示不是有效的导出文件&#xff0c;标头验证失败 原因&#xff1a;这是因为导出的imp文件和你当前导入的数据库版本不一致造成的&#xff0c;例如&#xff1a;导出文件版本号12.0.1 导入数据库的版本号11.0.2&#xff0c;会报这个错误。 解决办法…

【Java EE】获取Cookie和Session

文章目录 &#x1f38d;Cookie简介&#x1f340;理解Session&#x1f333;Cookie 和 Session 的区别&#x1f332;获取Cookie&#x1f338;传统获取Cookie&#x1f338;简洁获取Cookie &#x1f334;获取Session&#x1f338;Session存储&#x1f338;Session读取&#x1f33b;…

tsc --init 报错

运行 tsc --init 报错&#xff0c; 全局安装 ts 也不行 通过 npx tsc --init 就可以解决

创建大量栅格文件并分别写入像元数据:C++ GDAL代码实现

本文介绍基于C语言GDAL库&#xff0c;批量创建大量栅格遥感影像文件&#xff0c;并将数据批量写入其中的方法。 首先&#xff0c;我们来明确一下本文所需实现的需求。已知我们对大量遥感影像进行了批量读取与数据处理操作——具体过程可以参考文章C GDAL提取多时相遥感影像中像…

python开发poc,fofa爬虫批量化扫洞

学习使用python做到批量化的漏洞脚本 1.通过fofa搜索结果来采集脚本 2.批量化扫描漏洞 ---glassfish存在任意文件读取在默认48484端口&#xff0c;漏洞验证的poc为: "glassfish" && port"4848" && country"CN" http://loca…

渗透学习第一天:DR4G0N B4LL靶场复现

0x00 环境搭建 攻击机为kali Linux&#xff0c;IP为192.168.71.129 靶机IP地址目前不知道&#xff0c;但是是和kali同网段的 0x01 信息收集 由于不知道目标的IP地址&#xff0c;这里我采用了arp scan对本机的整个网段进行扫描 发现目标IP为192.168.71.130。对目标IP进行端…

新品攻略—小功率、小体积、高效率!LED驱动模块RSC6218A

瑞森半导体&#xff08;REASUNOS&#xff09;推出应用在5W-18W LED电源上的LED驱动模块RSC6218A。 LED驱动模块RSC6218A是一款LLC 谐振拓扑功率模块&#xff0c;带有半桥驱动的控制电路和功率转化器件&#xff0c;适用于 LED 恒流控制线路&#xff0c;电路工作频率可达200KHz。…

MATLAB绘采用低通滤波处理加噪方波信号

MATLAB绘采用低通滤波处理加噪方波信号 clc;close all;clear all;warning off;%清除变量 rand(seed, 100); randn(seed, 100); format long g;% MATLAB代码&#xff1a;绘制加噪方波并采用低通滤波后绘制图像 % 参数设置 Fs 1000; % 采样频率 T 1/Fs; …

“更大的焦虑,更大的想象力”:音视频厂商如何闯入AI时代?

从GPT3.5到GPT4.0&#xff0c;从Runway、Pika到Sora&#xff0c;当大模型的价值链不断升级&#xff0c;那些暂未爬到顶端的企业&#xff0c;还剩下多少‘生存空间’&#xff1f; 于音视频厂商而言&#xff0c;企业要解决的难题是&#xff0c;如何将技术与用户连接在一起。让大…

PPE-个人防护装备如何定义?为什么说PPE是劳动者的护身神器?

个人防护用品定义 PPE&#xff0c;即个人防护装备、个人防护用具或劳保用品&#xff0c;是劳动场所中不可或缺的重要组成部分。它们扮演着保护工人免受各种危害的关键角色。从安全帽到反光衣&#xff0c;再到防护手套和安全鞋&#xff0c;PPE覆盖了各个方面&#xff0c;为工人…

线性变换在人工智能领域的深度实践与应用探索

线性变换&#xff0c;作为数学中的一种基本工具&#xff0c;在人工智能领域中发挥着举足轻重的作用。其强大的表示能力和灵活的运算特性使得线性变换成为机器学习、深度学习等多个子领域的核心组成部分。本文将详细探讨线性变换在人工智能领域中的实践应用&#xff0c;旨在揭示…

Qt plugin 开发UI界面插件

目录 1.创建接口 2.创建插件 3.创建插件界面 4.插件实现 5.创建应用工程 6.应用插件 1.创建接口 打开QtCreater&#xff0c;点击左上角“文件”->新建文件或项目&#xff0c;在弹窗中选择C/CHeader File。 输入文件名&#xff0c;选好路径&#xff08;可自行设置名称…

HarmonyOS 开发-二级联动

介绍 本示例主要介绍了List组件实现二级联动&#xff08;Cascading List&#xff09;的场景。 该场景多用于短视频中拍摄风格的选择、照片编辑时的场景的选择。 效果图预览 使用说明&#xff1a; 滑动二级列表侧控件&#xff0c;一级列表随之滚动。点击一级列表&#xff0c;…

【数据交换格式】网络socket编程温度采集智能存储与上报项目技术------JSON、TLV

作者简介&#xff1a; 一个平凡而乐于分享的小比特&#xff0c;中南民族大学通信工程专业研究生在读&#xff0c;研究方向无线联邦学习 擅长领域&#xff1a;驱动开发&#xff0c;嵌入式软件开发&#xff0c;BSP开发 作者主页&#xff1a;一个平凡而乐于分享的小比特的个人主页…

【单片机】74HC4052电路图,单片机端口复用电路

74HC4052电路图 如下图&#xff0c;还是很好理解&#xff0c;PA9、PA10是单片机引脚。 当A和B是00&#xff0c;那么就是X-COM和0X短路&#xff0c;Y-COM和0Y短路。 当A和B是01&#xff0c;那么就是X-COM和1X短路&#xff0c;Y-COM和1Y短路。 以此类推。 74HC 工艺可以直接3.…

网传桌面版telegram RCE 0day

网传根据区块链安全公司CertiK发布的一份新报告&#xff0c;CertiK 发现Telegram桌面版的处理媒体文件过程&#xff0c;可能存在RCE漏洞。此漏洞会使用户面临特制媒体文件&#xff08;例如图像或视频&#xff09;的恶意攻击。 CertiK Alert 于 4 月 9 日在社交媒体平台 X 上警…

冯喜运:4.10周三外汇现货黄金原油走势分析及操作建议

黄金走势分析&#xff1a;黄金目前的波动已经基本没有什么技术面可言了&#xff0c;现在主要就是重点看市场消息面影响所造成的砸盘力度情况&#xff0c;但当下不管是战争因素所带来的避险情绪影响还是美国降息与否所带来的经济影响都无疑还是支撑着黄金继续走高&#xff0c;那…