《剑指offer》【面试题3:二维数组中的查找】

LPDDR6与LPDDR5 channel/rank/die/bank技术探讨 阅读详情
面试题3:二维数组中的查找

数组基础点:
一种基本的数据结构,用于在一块连续的内存中并按照顺序存储数据。创建数组时,先指定数组的大小,然后根据数组的大小进行分配内存。即使在数组中只存储一个数字,也要为整个数组分配内存大小。所以数组的空间利用率不是很好,经常会有空闲的区域没有很好的利用而浪费掉。

但是数组的内存连续也有它的优点:可以根据下标在O(1)时间读、写任何元素,所以对于访问数组中的元素的效率还是很好的(这里说的是根据下标访问,列如:array[1];但是需要查找一个元素时,需要遍历整个数组,这时候时间复杂度就是O(n)了);

面试题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

分析:
对于这种事先,每一行每一列都是递增有序的二维数组,我们可以找临界点,作为突破口进行解决。所以根据观察得出,右上角是第一行最大的值,是最后一列最小的值,所以用这个点与所要查找的数字进行比较,来把这个二维数组的范围逐渐缩小,为什么选这个由上角呢,因为与一个数判断,结果要么是等于、大于、小于这三种情况,所以也就是说让你选的这个点有一个移动的方向,不能让它盲目的四处乱窜,对吧。右上角这个点左移可以使数值缩小,下移可以使数值增大,所以也就有了所谓的方向感,也符合判断结果的三个走向,通过移动,使移动的这个点与所要查找的值不断判断,不断的缩小范围,直到找到查找的数字,或者查找的范围缩小为空。
右上角为例:


图解:


#include <stdio.h>
#include <assert.h>
//从右上角可以查找
//array 数组名	  rows 行    cols列    number 查找的数字
bool TwoArrayFind_number(int *array,int rows,int cols,int number)
{
	bool count = false;
	assert(array != NULL);
	if (rows <= 0 && cols <= 0)
	{
		return -1;
	}
	int row = 0;
	int col = cols-1;//从右上角开始
	while(row < rows && col >= 0)
	{
		if (array[row * cols + col] == number)
		{
			count = true;
			break;
		}
		else if (array[row * cols + col] > number)
		{
			col--;//列左移一个格子
		}
		else
		{
			row++;//行下移一个格子
		}
	}
	return count;

}



int main()
{
	//测试用例 *谨记行移动一次乘以总列数(而不是变化的列)
	//判断编译器下的真假值
	printf("%d\n",true);//真为1
	int arr[17] = {1,2,8,9,2,4,9,12,4,7,10,13,6,8,11,15};
	//数组中介于最大值最小值之间
	printf("%d\n",TwoArrayFind_number(arr,4,4,7));
	//数组最小值
	printf("%d\n",TwoArrayFind_number(arr,4,4,1));
	//数组最大值
	printf("%d\n",TwoArrayFind_number(arr,4,4,15));
	//大于数组最大值,不存在数组中
	printf("%d\n",TwoArrayFind_number(arr,4,4,16));
	//小于数组最小值,不存在数组中
	printf("%d\n",TwoArrayFind_number(arr,4,4,0));
	//介于数组最大值与最小值之间,但是不存在数组中
	printf("%d\n",TwoArrayFind_number(arr,4,4,5));
	//特殊测试:空指针
	printf("%d\n",TwoArrayFind_number(NULL,4,4,15));
	return 0;
}
既然右上角可以,相应的左下角也可以:即左下角点与查找的数字比较所得结果的三种走向,要么相等、要么小于、要么大于。相等返回真,移动的点<查找的数字,右移;移动的点>查找的数字,
上移。类似于由上角缩小范围,直到找到查找的数字,或者范围缩小为空返回假。
代码实现:
//从左下角可以查找
//array 数组名	  rows 行    cols列    number 查找的数字
bool TwoArrayFind_number2(int *array,int rows,int cols,int number)
{
	bool count = false;
	assert(array != NULL);
	if (rows <= 0 && cols <= 0)
	{
		return -1;
	}
	int row = rows-1;//从左下角开始
	int col = 0;
	while(col < cols && row >= 0)
	{
		if (array[col * rows + row] == number)
		{
			count = true;
			break;
		}
		else if (array[col * rows + row] > number)
		{
			row--;//行上移一个格子
		}
		else
		{
			col++;//列右移一个格子
		}
	}
	return count;

}



int main()
{
	//测试用例 *谨记列移动一次乘以总行数(而不是变化的行)
	//判断编译器下的真假值
	printf("%d\n",true);//真为1
	int arr[17] = {1,2,8,9,2,4,9,12,4,7,10,13,6,8,11,15};
	//数组中介于最大值最小值之间
	printf("%d\n",TwoArrayFind_number2(arr,4,4,7));
	//数组最小值
	printf("%d\n",TwoArrayFind_number2(arr,4,4,1));
	//数组最大值
	printf("%d\n",TwoArrayFind_number2(arr,4,4,15));
	//大于数组最大值,不存在数组中
	printf("%d\n",TwoArrayFind_number2(arr,4,4,16));
	//小于数组最小值,不存在数组中
	printf("%d\n",TwoArrayFind_number2(arr,4,4,0));
	//介于数组最大值与最小值之间,但是不存在数组中
	printf("%d\n",TwoArrayFind_number2(arr,4,4,5));
	//特殊测试:空指针
	printf("%d\n",TwoArrayFind_number2(NULL,4,4,15));
	return 0;
}
既然左下角、右上角都说了,不妨说一下左上角,其实左上角找也可以,逻辑思想更符合平常的理解,但是首先它要卡出一个范围,即把这个数字与两列进行比较,把一开始的大范围缩小,然后再按照右上角的方法进行“回退”,即下移或者左移,直到找到查找的数字为止。但是用左上角找注意的是,有序是指每一列、每一行。有时候会出现“漏掉”的可能,比如上述图中的'6'就是一个不错的测试用例,用在左上角查找时。(自己去发现吧偷笑)


Open3D 基于法向量夹角的特征点提取 基于法向量夹角的特征点提取是一种在点云处理中用于识别表面变化显著区域的技术。通过计算点云中每个点的法向量与其邻域点法向量之间的夹角,可以判断点云表面的局部变化程度,并提取那些法向量变化较大的点作为特征点。这种方法特别适用于提取边缘、角点等关键几何特征。 阅读详情

相关推荐

小曾WRF自学日记(3)渐入佳境 ——WRF实例-数据下载与WPS前处理

ww

weixin_46297571的博客 1480

剑指offer 二维数组中的查找

题目 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 思路1 直接遍历数组,逐个元素与target比较,找到就就返回 true 时间复杂度O(n^2) 思路2 有题意可知,该数组是有序的,所以可以使用二分查找 把每行当成一个一维数组,逐行进行二分查找。 ...

jcjcjcjiangcheng的博客 166

论文阅读笔记(一)细粒度图像检索

0、参考文献 [1]见微知著 http://geek.youkuaiyun.com/news/detail/191718 [2]Xiu-Shen Wei 《Selective Convolutional Descriptor Aggregation for Fine-Grained Image Retrieval》 [3]Lingxi Xie 《Fine-Grained Image Search》 1...

huang2818138的博客 1万+

二维数组中的查找

转自:http://liuqing-2010-07.iteye.com/blog/1330830 1.1. 问题描述      在一个二维整数数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。       例如下面的二维数组就是每行、每列都递增排序。如果在这个数组中查找数字7,则返回tr

chivalry 1万+

超详细 VMware Horizon 虚拟桌面VDI安装步骤

主要的目的是模拟生产环境中的共享存储。自动桌面相当于共享电脑,大家使用同一个虚拟机,对虚拟机的修改都放在用户的配置文件中,RDS桌面池相当于共享的服务器,可以多人同时连接到服务器上。1:之前已经建立好了NFS的存储,这部分配置好后,以后的虚拟机可以安装到NFS的存储中。2: 使用Composer发布系统可以解决SID,机器名冲突的问题,更重要的可以节约磁盘空间,发布的所有系统可以访问一块磁盘。26: 域选择我们之前建立的域,用户名我输入的是管理员,可以在AD域新建用户点击查找,我这里用的是管理员。

vv12345的博客 1万+

【71页PPT】工业40及智能制造解决方案(附下载方式)

2013年,工业4.0平台发布白皮书,正式确立其发展战略。工业4.0不仅是技术的升级,更是制造业思维的重构。工业4.0的核心是通过信息物理系统(CPS)实现工厂内外的互联,构建高度灵活的个性化生产模式。它不仅是技术革新,更是一种生产方式的变革,使传统行业界限模糊化,催生新的商业模式和合作形式。德国作为制造业强国,其GDP的25%和出口总额的60%依赖制造业,因此工业4.0成为其维持全球领先地位的重要战略。CPS是工业4.0的基石,通过计算、通信与控制技术(3C)实现物理世界与信息世界的深度融合。

2501_92808811的博客 950

剑指Offer面试题4二维数组中的查找

面试题4.二维数组中的查找题目思路一思路二 题目 在一个 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] ] 给定 t

weixin_43859246的博客 234

YOLOv11改进 | Neck篇 | 独创HFPN利用分层特征融合块HFFB模块融合多层次特征改进yolov11(全网独家创新)

本文给大家带来的最新改进是利用分层特征融合块HFFB创新yolov11的neck部分我称之为HFPN,这个模块可以融合局部特征、全局特征、中间特征将三种特征融合在一起辅助yolov11进行检测,经过我的设计分为三种可以针对大目标、小目标、标准目标的检测方式均不同,大家可以根据自己的数据集进行不同的选择,本文的内容为我独家创新。YOLOv11改进系列专栏——本专栏持续复习各种顶会内容——科研必备目录一、本文介绍二、原理介绍三、核心代码四、添加方法4.1 修改一4.2 修改二4.3 修改三4.4 修改四。

Snu77的博客 5210

《剑指Offer》面试题3:二维数组中的查找(行列分别有序数组的二分查找)

题目:在一个二维数组中,每一行都按照从左dao'you

Honkee_的专栏 2809

STM32堆栈溢出问题及解决方法

堆栈是用于存储函数调用和局部变量的内存区域,它是一种先进后出的数据结构。如果函数嵌套层级过深或者局部变量占用的内存空间过大,堆栈的大小可能不足以容纳这些信息,从而导致堆栈溢出。在一些特殊情况下,可以使用堆内存替代堆栈,以避免堆栈溢出问题。在STM32的工程中,可以通过修改链接脚本文件(.ld文件)中的堆栈大小参数来增加堆栈空间。通常,堆栈大小设置为RAM的一小部分,但需要根据具体应用的需求进行调整。堆栈溢出是嵌入式系统开发中常见的问题之一,特别是在使用STM32微控制器时。3.3 使用堆内存替代堆栈。

ZwcCsharp的博客 2593

内网渗透(二)之基础知识-工作组介绍

在一个大型单位里,可能有成百上千台计算机互相连接组成局域网,它们都会列在"网络"(网上邻居)内。如果不对这些计算机进行分组,网络的混乱程度是可想而知的 为了解决这一问题,产生了工作组( Work Group)这个概念。将不同的计算机按功能(或部 门)分别列入不同的工作组,例如技术部的计算机都列入"技术部"工作组、行政部的计算机都 列入"行政部"工作组。要想访问某个部门的资源,只要在"网络"里双击该部门的工作组名 就可以看到该部门的所有计算机了。相比不分组的情况,这样的情况有序得多(尤其对大型局域网来说)。

把自己活成一道光,因为你不知道,谁会借着你的光,走出了黑暗。请保持心中的善良,因为你不知道,谁会借着你的善良,走出了绝望。请保持你心中的信仰,因为你不知道,谁会借着你的信仰,走出了迷茫。请相信自己的力量,因为你不知道,谁会因为相信你,开始相信了自己.... 1219

【剑指Offer学习】【面试题3 :二维数组中的查找】

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

https://github.com/Wang-Jun-Chao 2万+

第六节 LLaVA模型数据处理源码解读(input_ids/labels/attention_mask/image,上篇)

本篇文章直接介绍llava模型数据加工部分,整体结构说明llava多模态模型输入数据格式,其中包含input_ids/labels/attention_mask与image格式,并给出对应代码位置与整个数据加工流程。最重要,通过debug给出数据解释与代码解读,也通过一个真实数据给出模型输入格式说明。当你阅读完此篇文章,绝对透彻理解llava数据加工过程与内容。显然,一篇博客是无法呈现整个数据细节,我将继续下篇博客呈现数据细节处理。result = input.ne(3) # torch.ne函数调用。

weixin_38252409的博客 3193

剑指Offer 面试题3:二维数组中查找

剑指Offer 面试题3:二维数组中查找 题目:在一个二维数组中,每一行都是按照从左到右递增的顺序排列,每一列都按照从上到下递增的顺序排序,请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。例如下面的数组 1 2 8 9 2 4 9 12 4 7 10 13 6

水水哥哟哟的博客 413

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【剑指Offer】面试题3:二维数组中的查找

《剑指Offer——名企面试官精讲典型编程题》 作者:何海涛 一、书上原题再现 面试题3:二维数组中的查找 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。 请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 二、涉及的知识点   三、解题过程 首先一看到数组,就会下意识的想到遍历,就是挨个比较,看看要...

midnight_time的博客 448

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

《剑指offer》面试题3:二维数组中的查找

面试题3:二维数组中的查找 面试题3:二维数组中的查找题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的个二维数组和一个整数,判断数组中是否含有该整数。   例如下面的二维数组就是每行、每列都递增排序。如果在这个数组中查找数字7,则返回true;如果查找数字5,由于数组不含有该数字,则返 false。 1 2 8 ...

专注于C/C++/Linux领域创作 336

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

剑指offer 面试题3:二维数组中查找

题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 思路分析: 首先选取数组右上角的数字。比较该数字和要查找的数字: 如果该数字等于要查找的数字,查找过程结束; 如果该数字大于要查找的数字,剔除该数字所在列; 如果该数字小于要查找的数字,剔除该数字所在的行。 下面是

海阔天空sky的博客 669

【剑指offer】面试题3:二维数组中的查找

题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

solar一抹阳光的专栏 1180

【一刷《剑指Offer》】面试题 3:二维数组中的查找

核心考点:数组相关,特性观察,时间复杂度把握。

Elena's Blog 1317

《剑指offer》Python语言 面试题3:二维数组中的查找

写在开头的话:     当想写这个的时候,发现已经有人做了这个工作了,详情请见Python基础算法/剑指offer,然而依然决定自己写下这个系列,作为算法部分的巩固和提高。在自己写完后会借鉴Python基础算法/剑指offer的代码,如有部分重复,还请见谅。 # -*- coding: UTF-8 -*-. ''' 在一个二维数组中,每一行都按照从左到右严格递增的顺序排序 每一列都按照从上到下

da_da007的博客 975

剑指offer之面试题3:二维数组中的查找

题  目: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 解题思路: 由于二维数组元素的值是有规律的,从左到右(从上到下)是按照值递增的顺序排列的,故不应该对整个数组进行盲目(双层循环解决)搜索查找。在查找所查找的值number是否存在于二维数组,我们从 “右上

u010665065的博客 346

剑指offer面试题3:二维数组中的查找 java实现

题目描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下的递增的顺序。 请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

做一名努力的通信程序员 620

剑指Offer面试题3:二维数组的查找 Java实现

题目:二维数组的查找 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下的顺序排列。请完成一个函数,输入这样的一个二维数组和一个整数,判断该数组是否含有该整数。例如在下面的二维数组中,如果查找数字7,则返回true;如果查找数字5,由于矩阵不含有该数,则返回false。 1    2    8     9 2    4    9     12

做一名努力的通信程序员 432

剑指offer——面试题3:二维数组中的查找

剑指offer——面试题3:二维数组中的查找 1.笨蛋方法 复杂度为O(n2)O(n2)O(n^2) class Solution { public: bool Find(int target, vector&lt;vector&lt;int&gt; &gt; array) { for(int i=0;i&lt;array.size();i++){ ...

Allenlzcoder的博客 397

《剑指offer》面试题3:二维数组的查找(java实现)

《剑指offer》面试题3:二维数组的查找(java实现) 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 ——来源于《剑指offer》 解题思路 选取左下角或者右上角的元素与输入的整数进行比较,如果相等就返回,否则就剔除相应的行或者列再重复上面操作。 利用递归实现:...

芊雨的博客 203

《剑指Offer》面试题3:二维数组中的查找

《剑指Offer——名企面试官精讲典型编程题》 作者:何海涛 一、书上原题再现 面试题3:二维数组中的查找 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。 请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 二、涉及的知识点 三、解题过程 ...

weixin_30596165的博客 231
上一篇: 网易游戏编程第二题-------表达式求值
下一篇: 《剑指offer》【面试题4:替换空格】
IT_model
博客等级 码龄9年 61粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值