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

用Python爬取公众号历史所有文章,看这篇就够了 手把手教你爬取公众号历史所有文章 阅读详情
面试题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'就是一个不错的测试用例,用在左上角查找时。(自己去发现吧偷笑)


Modbus协议全家桶(C#纯原生完整版):ModbusRTU + ModbusTCP + ModbusASCII 协议规范+完整封装+工业级实战 你已经掌握了C#串口/网口原生核心API和工业通信协议本质,而今天的主角Modbus协议,是工业通信领域绝对的王者、通用的标准、入门的必修课,没有之一。凡是做工业通信开发,必会Modbus协议;市面上99%的工业设备(PLC、变频器、温控仪、传感器、流量计、扫码枪)都原生支持Modbus协议。Modbus协议不是单一协议,而是一个「协议家族」,我们常说的就是这个家族的三大核心成员,也是工业现场的全部Modbus应用形态。 阅读详情

相关推荐

Jetson Orin NX上PyTorch环境搭建与性能优化指南

本文详细指导如何在Jetson Orin NX上搭建高效的PyTorch开发环境。内容涵盖CUDA与cuDNN的“隐藏”配置、Miniconda虚拟环境管理、PyTorch for Jetson的正确安装与验证,并提供了电源模式设置、TensorRT加速、混合精度等关键性能优化实战技巧,帮助开发者充分释放边缘AI设备的算力。

weixin_29090089的博客 337

剑指offer 二维数组中的查找

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

jcjcjcjiangcheng的博客 166

微信小游戏CE修改实战:从入门到精通(附防作弊思路)

本文深入探讨微信小游戏的安全攻防实战,重点分析CE修改、反编译和重打包等安全风险。通过详细的内存修改案例和代码保护方案对比,提供从客户端到服务端的全方位防护策略,帮助开发者构建有效的防作弊体系。

m2n3b4v5c6的博客 1139

二维数组中的查找

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

chivalry 1万+

1panel面板实战:Docker容器存储路径迁移与优化指南

本文详细介绍了在1panel面板中迁移Docker容器存储路径的完整流程与优化方法。针对系统盘空间不足的常见问题,通过停服务、搬数据、改配置三个核心步骤,指导用户安全地将Docker数据目录迁移至更大容量的独立分区,并提供了迁移后的深度管理技巧与常见避坑指南,帮助用户优化服务器存储资源。

ol789012的博客 865

Harness Engineering:让Coding Agent真正落地生产

本文将带你系统性地了解如何让Coding Agent真正落地生产,核心是依托(全球领先的持续交付、云成本管理、 feature flagging、安全治理一体化平台),结合企业级AIDD(AI-Driven Development)的工程化实践,构建一套可信赖、可观测、可扩展、可治理的Coding Agent落地体系。核心概念与理论基础:什么是Coding Agent?它和普通的AI代码补全工具(比如GitHub Copilot)有什么区别?什么是Harness Engineering?

移动开发前沿的博客 455

剑指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

OpenCV-Python实战(26)——复杂场景下的实时物体检测与跟踪

本节介绍了一种鲁棒的特征跟踪方法,该方法速度足够快,能够实时应用于网络摄像头的视频流。首先,算法展示了如何在一幅图像中提取和检测重要特征——无论是我们感兴趣的模板图像(训练图像),还是预期包含该物体的更复杂场景(查询图像),这些特征都具有视角和尺寸不变性。然后对关键点进行聚类,找到两幅图像中特征点之间的匹配。在此基础上,可以计算出一个将一组特征点映射到另一组的透视变换矩阵。利用这些信息,我们可以在查询图像中勾勒出训练图像的轮廓,并对查询图像进行透视变换,使感兴趣的物体以直立状态显示在屏幕中央。

盼小辉丶的博客 1907

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

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

Honkee_的专栏 2809

基于Simulink的鲸鱼优化算法(WOA)MPPT仿真

摘要:本文介绍了基于Simulink的鲸鱼优化算法(WOA)在光伏MPPT控制中的应用。WOA模拟座头鲸的"气泡网捕食策略",通过包围猎物、螺旋收缩和随机搜索三阶段动态平衡全局探索与局部开发能力,有效解决局部阴影导致的多峰P-V曲线问题。文章详细讲解了WOA-MPPT的Simulink建模过程,包括多峰光伏阵列建模、WOA控制器实现和Boost变换器控制。仿真结果显示,在三种典型工况下,WOA-MPPT的追踪效率>99.3%,动态响应时间<0.15s,性能优于传统算法。最后提出了混合WO

amy_mhd的博客 72

人形机器人硬件电路设计入门

人形机器人属于。

blotemj.blog.youkuaiyun.com 229

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

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

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

SAP BTP ABAP RAP 开发对象命名规范与落地实践

摘要:SAP BTP ABAP开发中的命名规范实践 在企业级ABAP开发中,命名规范是提升交付效率的工程化手段。SAP推荐采用[/<namespace>/][<prefix>]_<object_name>_[<suffix>]的结构化命名框架,解决多对象、多团队的协同问题。关键实践包括:使用组织专属命名空间避免冲突;通过prefix区分同类型对象的不同语义(如UI_/API_);object_name体现业务语义而非技术细节;suffix表达次级差异。在具体对

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1433

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

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

水水哥哟哟的博客 413

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

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

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

midnight_time的博客 448

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

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

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

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

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

剑指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、付费专栏及课程。

余额充值