二维数组中的查找(两种解法,各有千秋)

简介: 二维数组中的查找(两种解法,各有千秋)

凡事都有可能,永远别说永远。——《放牛班的春天》


今天一题为再一个行列都有序的二维数组中寻找一个目标值,我们第一时间想到的可能是很暴力的解法,例如从头到尾进行遍历,这样能做出来,但是借用武忠祥老师的一句话:这样做你就慢了,没效率。


本文章会从复杂度的角度来分析一个算法,循序渐进的提升这个算法的优秀程度。最终优化为最优算法。


一.题目及示例


在一个二维数组array中(每个一维数组的长度相同), 每一行都按照 从左到右递增的顺序排序, 每一列都按照 从上到下递增的顺序排序。请 完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

[
[1,2,8,9],
[2,4,9,12],
[4,7,10,13],
[6,8,11,15]
]
给定 target = 7,返回 true。
给定 target = 3,返回 false。


下面给出示例:


8a9dd7e681b8899ceaede2b1604e8b79.png


解法一(暴力解法):


拿到这道题目,第一种方法不难想到,就是对整个数组进行遍历,每一个元素都扫一遍。这种解法比较暴躁,很暴力,给它一个外号,叫"暴力解法"。

具体代码实现如下:

bool Find(int target, vector<vector<int> > array) {
        // 利用C++的auto进行遍历
        for(auto x:array) {
            for(auto y:x){
                // 如果存在,直接返回true
                if(y==target){
                    return true;
                }
            }
        }
        return false;


ps:这里的for循环不是普通的for循环,这是C++新定义的for循环,具体使用可以去看我下一篇博客。


我把他称之为升级版for循环。


复杂度分析:

  • 需要对二维数组的每个元素进行遍历,时间复杂度为O(n^2)
  • 存储一个二维数组,空间复杂度为O(1)

解法二(双指针法)


由于矩阵行列都是严格递增的,此矩阵为杨氏矩阵,故也称杨氏矩阵法。


如果这个是一个没有任何规律的数组,那么可能就只有那种写法了,但是这个题目(红字)告诉我们这个数字从上到下,从左到右都是递增的,所以我们可以从这个方向入手。我们发现,我们找一个数,最快的办法无非就是利用二分进行查找,但是我们发现这个题目是一个二维单调的。所以我们要想办法找到一个方法可以在我们判断到数字小了或者大了的时候可以进行一个范围的缩小。这样的话,我们就可以定义两个指针,放到右上角或者左下角。这里我放到右上角进行讨论。

初始的时候,我们的两个x和y的指针放到了右上角。这样的话我们可以与目标数进行比较,如果发现这个数比目标数小了,我们就把y指针往下进行移动,y指针自增。如果发现这个数比目标数大了,我们就可以往左边方向进行移动,x指针自减。

image.png

具体代码实现如下:

(右上角代码)

 bool Find(int target, vector<vector<int> > array) {
        int len1=array.size();  // 计算行数
        int len2=array[0].size();  //计算列数
        int posx=0,posy=len2-1; //定义两个指针,分别指向x和y的坐标
        while(posx<len1&&posy>=0){
            // 当前的数字比目标数字大,x指针左移
            if(array[posx][posy]>target){
                posy--;
            // 当前的数字比目标数字小,y指针往下移动
            }else if(array[posx][posy]<target){
               posx++;
            }else{
                return true;
            }
        }
        return false;
    }

(左下角代码)

bool Find(int target, vector<vector<int> > array) {
        int len1=array.size(); // 行数
        int len2=array[0].size();  //列数
        int posx=len1-1,posy=0; // 定义两个指针,分别表示x和y的指针
        while(posx>=0&&posy<len2){
            // 当前的数字比目标数字大,x指针往上移动
            if(array[posx][posy]>target){
                posx--;
            // 当前的数字比目标数字小,y指针往右方向移动
            }else if(array[posx][posy]<target){
               posy++;
            }else{
                return true;
            }
        }
        return false;
    }


复杂度分析:


由于x和y分别只能往一个方向进行移动。


  • 右上角版,最有最多只会遍历一行和一列的长度,时间复杂度为O(n+m)
  • 二维数组存储所有的元素,空间的复杂度为O(1)


我们做个总结,相对于第一题,第二题的时间复杂度从n^2到m+n得到提升,提升的原因就是很好的利用升序这个特点来优化

相关文章
|
NoSQL 小程序 C语言
GDB调试学习(四):段错误
GDB调试学习(四):段错误
511 0
|
2月前
|
机器学习/深度学习 自然语言处理 数据可视化
22_注意力机制详解:从基础到2025年最新进展
在深度学习的发展历程中,注意力机制(Attention Mechanism)扮演着越来越重要的角色,特别是在自然语言处理(NLP)、计算机视觉(CV)和语音识别等领域。注意力机制的核心思想是模拟人类视觉系统的聚焦能力,让模型能够在处理复杂数据时,选择性地关注输入的不同部分,从而提高模型的性能和可解释性。
|
5月前
|
机器学习/深度学习 人工智能 搜索推荐
快手封号是什么原因造成的?
快手账号封禁机制的技术逻辑与常见诱因
通过matlab分别对比PSO,反向学习PSO,多策略改进反向学习PSO三种优化算法
本项目使用MATLAB2022A版本,对比分析了PSO、反向学习PSO及多策略改进反向学习PSO三种优化算法的性能,主要通过优化收敛曲线进行直观展示。核心代码实现了标准PSO算法流程,加入反向学习机制及多种改进策略,以提升算法跳出局部最优的能力,增强全局搜索效率。
405 11
|
10月前
|
机器学习/深度学习 计算机视觉 网络架构
YOLOv11改进策略【模型轻量化】| 替换骨干网络 CVPR-2024 StarNet,超级精简高效的轻量化模块
YOLOv11改进策略【模型轻量化】| 替换骨干网络 CVPR-2024 StarNet,超级精简高效的轻量化模块
956 19
|
12月前
|
存储 关系型数据库 MySQL
10个案例告诉你mysql不使用子查询的原因
大家好,我是V哥。上周与朋友讨论数据库子查询问题,深受启发。为此,我整理了10个案例,详细说明如何通过优化子查询提升MySQL性能。主要问题包括性能瓶颈、索引失效、查询优化器复杂度及数据传输开销等。解决方案涵盖使用EXISTS、JOIN、IN操作符、窗口函数、临时表及索引优化等。希望通过这些案例,帮助大家在实际开发中选择更高效的查询方式,提升系统性能。关注V哥,一起探讨技术,欢迎点赞支持!
570 5
|
分布式计算 DataWorks 数据处理
"DataWorks高级技巧揭秘:手把手教你如何在PyODPS节点中将模型一键写入OSS,实现数据处理的完美闭环!"
【10月更文挑战第23天】DataWorks是企业级的云数据开发管理平台,支持强大的数据处理和分析功能。通过PyODPS节点,用户可以编写Python代码执行ODPS任务。本文介绍了如何在DataWorks中训练模型并将其保存到OSS的详细步骤和示例代码,包括初始化ODPS和OSS服务、读取数据、训练模型、保存模型到OSS等关键步骤。
699 3
|
监控 物联网 5G
驾驭车联网的力量:深入车联网网络架构
车联网,作为移动互联网之后的新风口,以网联思想重新定义汽车,将其从简单的出行工具演化为个人的第二空间。车联网涵盖智能座舱和自动驾驶两大方向,本文将从车联网基础网络角度带您深入探讨车联网的网络构架。
驾驭车联网的力量:深入车联网网络架构
|
人工智能 编解码 数据可视化
2023 年最好的36款 AI 生产力工具(六)
本文主要展示了36 款 AI 应用,可以帮助读者更快、更好地工作。每个人都在与ChatGPT交流,从完整的博客文章到特定代码行的功能都在询问。其结果令人惊叹。虽然我们仍在探索如何将这项技术纳入我们的工作流程中,但明显的是,人工智能工具正在改变游戏规则。尽管ChatGPT是目前最受欢迎的,但它远不是首款进入市场的人工智能应用程序。经过Zapier团队的大量研究和测试,总结出了以下36款能够改变工作方式的人工智能生产力工具。
358 1
|
SQL 安全 数据库
SQL Server 2022 安装步骤——SQL Server设置身份验证教程
SQL Server 2022 安装步骤——SQL Server设置身份验证教程
1287 0