首页 > 编程语言 >【408DS算法题】009进阶-二维数组的查找

【408DS算法题】009进阶-二维数组的查找

时间:2024-08-12 11:52:53浏览次数:17  
标签:进阶 408DS int 复杂度 元素 二维 数组 009 target

Index

题目

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

进阶要求——时间复杂度: O ( n + m ) O(n+m) O(n+m) 空间复杂度: O ( 1 ) O(1) O(1)
[n为二维数组的行数,m为二维数组的列数]


实现代码

如果不考虑时间复杂度的要求,可以采用暴力算法遍历二维数组进行查找,代码不难写出:

bool find(vector<vector<int>>& a, int target){
	int n=a.size();		// 二维数组的行数
	int m=a[0].size();	// 二维数组的列数
	for(int i=0; i<n; i++){
		for(int j=0; j<m; j++){
			if(a[i][j]==target){
				return 1;
			}
		}
	}
	return 0;
}

但如果要对时间消耗进一步优化,就需要考虑运用题中给出的特殊条件——数组的每一行和每一列都是递增的

故对于数组中的任意元素 x i j x_{ij} xij​都满足:坐标 ( i , j ) (i, j) (i,j)左上区域内所有元素都小于 x i j x_{ij} xij​,坐标 ( i , j ) (i, j) (i,j)右下区域内所有元素都大于 x i j x_{ij} xij​。
如图

因此,当扫描到坐标 ( i , j ) (i,j) (i,j)时,如果想找到更大元素,就需要向下或向右搜索;如果想找到更小元素,就需要向上或向左搜索。
在这里插入图片描述
为了在扫描过程中兼顾,可以扫描到所有元素可以调整元素增大减小这两点,我们可以选用以下搜索策略:
从二维数组右上角开始搜索,中途向下向左调整(左上角开始,向上向右调整亦可)。

具体实现如下:

bool find(vector<vector<int>>& a, int target){
	int n=a.size();
	int m=a[0].size();
	int i=0, j=m-1;
	while(i<n && j>=0){
		if(a[i][j]==target){
			return true;
		}
		// 当前元素太大,向左调整
		else if(a[i][j]>target){
			j--;
		}
		// 当前元素太小,向下调整
		else{
			i++;
		}
	}
	return 0;
}

分析

本题重点在于在尽可能低的时间复杂度在扫描过程中满足可以扫描到所有元素可以调整元素增大减小这两点。
只要满足这两点,就可以在有序的二维数组中以 O ( n + m ) O(n+m) O(n+m) 的时间复杂度查找到指定值。

此外本算法中使用了二维向量vector<vector<int>>作为二维数组(即每个元素都是一个vector<int>类型的向量)。

标签:进阶,408DS,int,复杂度,元素,二维,数组,009,target
From: https://blog.csdn.net/weixin_60702024/article/details/141073148

相关文章

  • 面向对象--进阶
    static关键字静态修饰符可以修饰成员变量和方法(一般是工具类)特点:1、被类的所有对象共享(比如oa在线办公人数)2、可以通过类名.的方式调用(推荐使用)3、随着类的加载而加载,优先于对象而存在(对象在调用的时候才创建)工具类的方法添加static修饰构造方法私有化(不允许创建对象......
  • 【408DS算法题】进阶011-20年真题_三元组的最小距离
    Index真题题目分析实现总结真题题目定义三元组(a,b,c)(a,b,c均为正数)的距离D=|a-b|+|b-c|+|c-a|给定3个非空整数集合S1、S2和S3,按升序分别存储在3个数组中。设计一个尽可能高效的算法,计算并输出所有可能的三元组(a,b,c)......
  • Scanner的进阶使用——基础计算
    通过Scanner,可以将我们输入的数字进行计算从而反映出和以及平均数1.定义两个变量,分别是输入的整数以及总数的和2.建立一个扫描器3.使用while关键字进行循环,在符合条件下(输入的是数字)可以一直进行计算过程4.设置电脑接收数据5.设置我们输入的次数以及数字的总和6.输出......
  • Scanner的进阶使用——数字的输入
    1.用Scanner输入数字(整数和小数)1.定义一个整数变量2.建立扫描器3.使用if4.建立电脑接收数据5.设置else(那么)语法6.关闭Scanner......
  • 【数据分析---- Pandas进阶指南:核心计算方法、缺失值处理及数据类型管理】
    前言:......
  • 【Redis进阶】Redis单线程模型和多线程模型
    目录单线程为什么Redis是单线程处文件事件理器的结构文件处理器的工作流程总结文件事件处理器连接应答处理器命令请求处理器命令回复处理器多线程为什么引入多线程多线程架构多线程执行流程关于Redis的问题Redis为什么采用单线程模型Redis为什么要引入多线程呢......
  • 【Redis进阶】缓存设计模式
    目录CacheAside(旁路缓存)模式概念读操作流程如上图所示写操作流程如上图所示代码示例总结Read-Through模式概念操作流程:优点:Write-Through模式概念操作流程:优点:Write-Behind(Write-Back)模式概念操作流程:优点:缺点:总结缓存设计模式是指将缓存作为系统架......
  • Android14音频进阶调试之命令播放mp3/aac非裸流音频(八十)
    简介:CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!新书发布:《Android系统多媒体进阶实战》......
  • 深入了解HTML链接:从基础到进阶——WEB开发系列06
    超链接是互联网中最有趣的创新之一,自互联网诞生起,它们就一直是互联网的一个核心特性,使网络成为一个互联的系统。超链接允许我们将文档连接到其他文档或资源,甚至是文档中的特定部分。通过一个简单的网址,可以提供应用程序。几乎所有网络内容都可以被转换为链接,点击或激活这些超链......
  • C语言进阶(6)
    1.结构体类型的声明和初始化结构体是一堆数据类型的集合体(与数组不同的是它可以是不同的数据类型)。结构体声明的是一个图纸,并不向内存申请空间,只有在设置变量的时候我们才进行划分空间给变量。结构体的变量数据类型可以理解成struct(结构体名),在初始化时我们就要牢记这个原则。......