AcWing 15. 二维数组中的查找(非递归算法和递归算法)

ackerman函数的两种非递归算法及源代码 第一种算法是数组递推,北航某年考研题,算法很好. 第二种算法用栈来消除递归,算法麻烦,但有助于理解递归栈的工作原理 立即下载

1.非递归算法

观察此二维数组(以下称为“矩阵”),可以发现该矩阵的副对角线上的每一个元素均满足一个规律,那就是其左侧在同一行的元素均比其小,下侧在同一列的元素均比其大。于是,从副对角线入手进行查找就可以通过一次比较操作排除一整行和一整列的元素。从而大幅缩短时间开销。具体操作就是,当前位置元素如果等于目标元素则直接返回true,小于目标元素则将遍历指针下移一个单位,大于目标元素则将遍历指针左移一个单位。如果发生了越界情况,则说明没有找到该元素。

假设输入的是一个n*m的矩阵,则该算法时间复杂度为O(n+m)。

具体代码如下:

class Solution {
public:
    bool searchArray(vector<vector<int>> array, int target) {
        if(array.empty() || array[0].empty()) return false;
        int n = array.size(), m = array[0].size();
        int i = 0, j = m - 1;
        while(i < n && j > -1){
            if(target == array[i][j]) return true;
            else if(target < array[i][j]) j--; //当前元素大于目标元素,遍历指针左移一个单位
            else i++; //当前元素小于目标元素,遍历指针下移一个单位
        }
        return false;
    }
};

2.递归算法

事先说明,这个算法虽然提交了之后依然可以AC,但是并没有任何实用价值(后面会分析这个问题)。之所以写出来是因为我觉得这是个很好的练习递归算法和分析时间复杂度的例子。

首先,我们从左上角的元素开始进入递归。如果某一个位置的元素正是目标元素则返回true。如果目标元素大于当前位置元素,则要考虑其右侧元素和下侧元素是否符合要求,因此要进入更深一层的递归。如果目标元素小于当前位置元素,则没有必要再进行递归查找(因为数组中的元素从左往右和从上往下均是递增排列的,即使继续查找,得到的元素也只会比目标元素更大),返回false即可。如果在查找的过程中发生越界,说明这一行或者这一列的元素均不是目标元素,返回false即可。

具体代码如下:

class Solution {
public:
    bool check(vector<vector<int>> &array, int &target, int i, int j){
        if(i >= array.size() || j >= array[0].size()) return false; //越界返回false
        if(target == array[i][j]) return true;
        else if(target < array[i][j]) return false;
        else if(target > array[i][j])
            return check(array, target, i + 1, j) || check(array, target, i ,j + 1);
    }
    
    bool searchArray(vector<vector<int>> array, int target) {
        return check(array, target, 0, 0);
    }
};

之所以说这个算法没有实用价值,是因为该算法的时间复杂度在最坏的情况下会达到O(2^n)(假设矩阵为n*n的方阵)。要分析这个算法的时间复杂度,需要掌握两个知识。一个是高中的一个排列组合问题:由n*m个单位正方形组成的n*m的矩形,从左上角的正方形开始到右下角的正方形为止,共有多少种不同的走法?另一个则是“二项式定理”。另外,邓俊辉老师的《数据结构(C++语言版)》中的最长公共子序列(LCS)问题的递归算法的时间复杂度分析过程与以上算法的分析过程基本上是如出一辙的。感兴趣的同学可以自己根据提示推导或者是查看资料再分析比较。

用递归查找有序二维数组的方法详解 本篇文章是对用递归查找有序二维数组的方法进行了详细的分析介绍,需要的朋友参考下 立即下载

相关推荐

实战指南:如何用Elasticsearch+Milvus搭建十亿级多模态搜索系统(含性能调优)

本文详细介绍了如何利用Elasticsearch和Milvus构建十亿级多模态搜索系统,包括架构设计、性能调优和实战部署。通过混合架构实现高效文本检索与向量相似度计算,显著提升查询性能与扩展能力,适用于大规模多模态数据处理场景。

x8y9z0的博客 1171

使用递归-实现二维矩阵数组

废话不多说,直接上代码: /* 函数递归 把[1,2] [3,4] [5,6] 得到 [1,3,5],[1,3,6],[1,4,5] ... arr : 需要递归的数组 [[1,2],[3,4],[5,6]] */ function diguiArrData(arr) { if (arr.length &lt;= 1) return arr; let ar

PresByter的博客 2044

SMPTE ST 2110 概论(三)

SMPTE ST 2110 概论(三)ST 2110-30:未压缩的PCM音频流ST 2110-31:非PCM音频传输ST 2110-40:辅助数据传输结语 ST 2110-30:未压缩的PCM音频流 鉴于音频系统是广播系统中最复杂,也是最重要的一套系统,我们先来回顾一下广电音频系统的历史。 最老式的音频都是基于模拟信号的,具有有限的动态范围,并且用连续的电压变化来描述音频。再后来就基于数字信号(...

Cidd0422的博客 1万+

使用递归找所有迷宫路径,求二维数组的存储量与地址(数据结构作业06)

从入口(1,1)到出口(4,2)的路径。,使用递归思想,找出。

2301_79431343的博客 341

利用CiteSpace实现知网专利文献的高效计量与可视化分析

本文详细介绍了如何利用CiteSpace软件对中国知网(CNKI)的专利文献进行高效的文献计量与可视化分析。文章提供了从数据获取、格式转换、参数设置到图谱解读的完整工作流,旨在帮助研究者快速掌握该工具,从而洞察技术领域的研究热点、核心机构、学者合作网络及发展趋势,提升专利情报分析效率。

weixin_28520495的博客 293

MAX96712在车载摄像头系统中的带宽分配与传输能力计算解析

在计算摄像头带宽与传输接口的关系时,需要考虑视频流的像素分辨率、帧率、颜色深度等因素。以 MAX96712 这种 GMSL2 产品为例,它支持每个链路在正向方向以 3Gbps 或 6Gbps 的固定速率工作。

weixin_43199439的博客 3328

递归分治算法之二维数组二分查找(Java版本)

[java]/** * 递归分治算法学习之二维二分查找 * @author Sking 问题描述:存在一个二维数组T[m][n],每一行元素从左到右递增,每一列元素从上到下递增,现在需要查找元素X(必在二维数组中)在数组中的位置,要求时间复杂度不超过m+n. */ package 递归分治;  public class BinarySearchInArray {     /**     * 二维二...

weixin_33868027的博客 406

deepstream车道线检测自定义插件化,其中要注意pipeline的配置,如果插件位置配置不对,会报input format should be RGBA when using blur-obje

以上代码中,我们先从对象池中获取一个 DsUserMeta 对象,然后使用 get_lane_line_from_frame 函数获取车道线检测结果,并使用 add_lane_line_meta 函数将其添加到 DsUserMeta 对象中。注意,上述代码中的 get_lane_line_from_frame 函数和 add_lane_line_meta 函数需要你自己实现,用于从视频帧中提取车道线检测结果,并将其添加到 DsUserMeta 中。

pvmsmfchcs的博客 690

python【剑指offer】二维数组中的查找 递归与非递归的实现

文章目录解题思路递归非递归 解题思路 数组是长下面这样的,从左到右递增,从上到下递增。 在遍历每一行的时候,如果遍历到一个元素大于target,那么当前元素所在的列及之后的列都不用遍历了。 例如target=7,遍历第一行元素,因为8>7,所以可以不必考虑8所在的列及之后的列。 把数组更新为array[1:,:2](如果是numpy的矩阵,是可以这样的),但是这里是列表,所以还是要用列表...

哪惧明天,风高路斜 763

医疗AI知识库更新慢?提示工程架构师用Agentic AI自动更新的策略

我们的目标是用Agentic AI替代传统更新流程中的“重复劳动”,让医疗知识库(以知识图谱为例)能自动跟踪最新医学进展,把“更新周期从数月缩短到数天”。从PubMed/指南数据库自动抓取新文献;用提示工程从文本中提取结构化医学知识;自动校验新知识与旧知识的冲突;将通过校验的知识写入知识图谱。拆问题:先讲医疗知识库更新慢的3大根源;给方案:用Agentic AI设计4个“小助手”解决问题;讲原理:每个小助手的工作逻辑+提示工程技巧;做实战。

AI 原生应用开发的博客 1061

基于共识的捆绑算法CBBA在多无人机多任务调度中的实现

在捆绑过程中,每个无人机根据自己的任务清单和其他无人机的任务清单,确定一个被称为“束”的集合。通过合理的任务分配和无人机协作,CBBA算法能够实现最优的任务调度,提高了多无人机系统的效率和执行能力。在每一轮迭代中,无人机根据自己的当前任务和位置信息将任务清单发送给其他无人机,并接收其他无人机发送过来的任务清单。通过比较其他无人机的任务清单和自身的任务清单,每个无人机可以更新自己的任务分配情况。在这一步中,每个无人机根据自己选择的新任务,更新自身的任务清单,并将更新后的清单发送给其他无人机。

持续更新 1156

二维数组中的递归算法

这两道题目分别来自爱奇艺 2017 年内推笔试题和 2019 年猿辅导算法题。 第一题 题目描述 Michael 喜欢滑雪这并不奇怪, 因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael 想知道在一个区域中最长的滑坡。区域由一个二维数组给出,数组的每个数字代表点的高度。下面是一个例子 1 2 3 4 5 16...

L__ear的博客 2018

【机器学习与数据挖掘实战 | 商务】案例03:基于k近邻算法的非侵入式电力负荷监测与分解的电力分析

本案例结合非侵入式电力负荷监测与分解的案例,重点介绍了在数据可视化的辅助下k近邻算法的应用。首先利用数据可视化寻找数据的特征,构建特征集合。然后构建k近邻模型,利用构建的特征集合训练模型,接着利用该模型对单一设备所属类别进行判定,最后计算实时用电量。

Morse_Chen的博客 2303

04. 二维数组中的查找

在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 示例: 现有矩阵 matrix 如下: 给定 target = 5,返回 true。 给定 target = 20,返回 false。 class Solution { public boolean findNumberIn2DArray(int[][] matrix, int target) {

carpe_diem0的博客 279

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

有序二维数组查找的两种方法:从左上角(递归)和右上角(非递归)出发

有序二维数组查找 这道题是在学习剑指offer这本书看到的,原题如下所示:   在一个二维数组中,每行都按照从左到右递增的顺序排序,每列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 分块治之 在拿到题目的时候,我并没有找到右上角那么优秀的特征,所以我选择二分查找的有序数组的思想,最初的想法是从最小值(左上角)到最大值(右下角)进行扇形搜...

士杰的博客 3135

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

杨氏矩阵查找数字(递归和非递归)

杨氏矩阵  有一个二维数组. 数组的每行从左到右是递增的,每列从上到下是递增的. 在这样的数组中查找一个数字是否存在。 要求:时间复杂度小于O(N);  例:  1 2 3          4 5 6          7 8 9 这里时间复杂度O(N) = row + col;            //行数+列数 要使时间复杂度小于O(N),则必须从右上角开始走或者从左下角开始,如图所...

Novice Player的博客 417

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

java二维数组的排序函数_用递归查找有序二维数组的方法详解

假设给定一个有序二维数组,每一行都是从左到右递增,每一列都是从上到下递增,如何完成一个函数,输入这样一个二维数组和一个整数,判断这个整数是否在这个二维数组中。假设一个4×4的有序二维数组: 1 2 8 92 4 9 124 7 10...

weixin_28802509的博客 302

二维数组中的查找问题(三种方法)

在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 二维数组为array[][],整数位target 一开始我想的是先从行判断,当target&gt;array[i]并且target&lt;array[i+1]的时候,那么就可以确定在这一行里面,后来还报了数...

小松与蘑菇 1788

递归查找有序二维数组

假设给定一个有序二维数组,每一行都是从左到右递增,每一列都是从上到下递增,如何完成一个函数,输入这样一个二维数组和一个整数,判断这个整数是否在这个二维数组中。 假设一个4×4的有序二维数组:           1          2          8          9           2          4          9          12

684

二维数组与递归

一、二维数组 1.1、二维数组概述 其实二维数组其实就是每一个元素为一维数组的数组。 1.2、二维数组定义格式及内存图解 二维数组格式1 数据类型[ ] 变量名 = new 数据类型[m][n]; m表示这个二维数组有多少个一维数组 必须写上 n表示每一个一维数组的元素个数 可选 举例: int [][] arr=new int [3][2]; 定义了一个二维数组arr,这个二维数组有3个一维...

xuefeiyuan1995的博客 712

二维数组的排列组合

题目一 给出一个类型二维数组,每个数组中是一个类目(如[["红色", "绿色"], ["大号", "小号"]]),返回所有类型的组合结果([["红色", "大号"], ["红色", "小号"], ["绿色", "大号"], ["绿色", "小号"]]) 题目二 输入 [[A, B], [a, b], [1, 2]] 输出 [Aa1, Aa2, Ab1, Ab2, Ba1, Ba2, Bb1, Bb2] 解题思路 multi 函数 参数:arrA,arrB 返回值:两数组的所有组合 功能:求两个数组之积

weixin_49314618的博客 1460

二维数组中的查找

感觉已经有点晚了,赶紧刷起来,不过我喜欢这种感觉。。 下面主要是用于自己的学习记录,会有参考学习大牛的思路,毕竟我还是小白。。。。 题目描述: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 首先这个题不难,有几个思路可以参考: 思路1:可以暴力搜索,...

lilong117194的博客 5467

AC剑指 Offer 04. 二维数组中的查找

在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 示例: 现有矩阵 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。 给定 ta

itbird的专栏 351

求矩阵中的相邻数

给定一个矩阵,给定一个矩阵中的位置,求矩阵中和此元素相邻且相等的元素数目,所谓相邻是指元素在矩阵中上下左右的四个元素,而且此相邻性是可以传递的,即相邻的相邻也是相邻元素  解决此题的主要思想是递归回溯。在给定位置中向四个方向拓展,记录相等的元素数目,防止重复访问还要对符合要求的元素标记。然后在此元素的四个相邻位置递归此操作。 代码如下: #include&lt;iostream&gt; ...

Jeff_Winger的博客 2938
上一篇: AcWing 14. 不修改数组找出重复的数字(分治法)
下一篇: AcWing 16. 替换空格
Zee_Chao
博客等级 码龄11年 168粉丝 135原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值