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

清理异常值(MAD:绝对中位差) 清理异常数据: 中位数绝对偏差(MAD):用来描述单变量样本在定量数据中可变的一种标准 在统计学中,绝对中位差是刻画一元数据样本变化的一个鲁棒度量。由公式可以看出,其求解还算简单,给定一个数据样本集,首先求其中位数,然后求原始数据减去中位数的绝对值从而形成一个新的数据样本,再求新的数据样本的中位数即为绝对中位差。比如说有一个数据样本集X={2 3 8 7 9 6 4},这时候数据的中位数是6,原... 阅读详情
面试题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'就是一个不错的测试用例,用在左上角查找时。(自己去发现吧偷笑)


即插即用篇 | 手把手教你 YOLOv11 添加注意力机制 | 适用于【检测任务】【分类任务】【分割任务】【关键点任务】| 20+ 种全打通! 阅读详情

相关推荐

【可不卸载重装】VS2019新建项目里没有CUDA选项

问题:VS2019 新建项目里没有CUDA选项,vs也属性没有cuda。这是因为你在Visual Studio 2019安装之前,先安装了CUDA Toolkit。

qq_62844901的博客 1319

剑指offer 二维数组中的查找

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

jcjcjcjiangcheng的博客 166

从三个角度理解知识图谱

2012年谷歌首次提出“知识图谱”这个词,由此知识图谱在工业界也出现得越来越多,对于知识图谱以及相关概念的理解确实也是比较绕。自己在研究大数据独角兽Palantir之后开始接触知识图谱,也算对其有了一定了解,这里从三个角度总结一下怎么去理解知识图谱。 几个基本概念:本体、实体、知识库、知识图谱 1、本体是概念的集合,是大家都公认的概念框架,一般不会改变如“人”、“事”、“物”、 “地”、“组...

JavaChaoCo的博客 6901

二维数组中的查找

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

chivalry 1万+

FPGA远程更新实战:Multiboot双镜像配置与Flash分区策略

本文详细介绍了FPGA远程更新中Multiboot双镜像的配置与实现,重点对比了XDC约束和ICAPE2原语两种配置方案的优缺点及适用场景。提供了基于W25Q128 Flash的非对称分区策略、MCS文件生成与烧写方法,并深入探讨了远程更新的流程容错处理与可靠性优化建议,帮助开发者构建稳定可靠的FPGA远程更新系统。

ss78901的博客 837

国产谷歌地球,地形分析秒杀同款地图软件

咱们做地质、林业、水文、水利、电力、GIS、地图、水保、环境的,需要经常用到各种数据,比如影像、地形、矢量、模型等,但目前80%的规划大数据展示都离不开ArcGIS,令人头大的是很多朋友连ArcGIS软件安装起来都费劲。。。 那不会ArcGIS又装不了Google Earth怎么开展工作? 今天推荐大家一款国产免费专业地图浏览下载测量分析神器—图新地球 图新地球,国产三维gis软件。可以查看高清卫星影像地形以及其他很多常用电子地图,对地图需求的掌握远胜过Google Maps,而且上手比国外软件要简单

GISWorld3D的博客 3685

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

别再手动调参了!用MATLAB+改进PSO算法,5步搞定机械臂轨迹优化(附完整代码)

本文介绍如何利用MATLAB和改进PSO算法快速优化机械臂轨迹规划,仅需5步即可完成传统耗时的手动调参过程。通过混沌初始化、自适应权重等创新方法,改进PSO算法显著提升优化效率,实现全局最优解搜索,适用于工业自动化中的机械臂控制。文章包含完整MATLAB代码实现,帮助工程师轻松应用于实际生产场景。

weixin_29232121的博客 354

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

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

Honkee_的专栏 2809

从 ST22 到根因定位:ABAP Dumps 全景排查指南(含典型 Dump 案例、修复套路与云时代实践)

本文系统介绍了SAP系统中ABAP短转储(Dump)的分析方法。首先指出短转储是程序运行时无法处理的错误导致系统强制终止执行。文章详细解析了短转储报告各区块的作用:从概述性的Short Text和What happened,到核心的Error Analysis和Source Code Extract,再到关键的系统字段Contents of system fields和调用栈Active Calls/Events。针对不同场景提供了排查建议:客户代码应建立可控边界,标准对象优先查阅SAP Notes。最后推

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

RK3588开发笔记-mipi csi接口imx415摄像头调试记录

摘要:本文详细介绍了RK3588开发板适配SONY IMX415 MIPI CSI摄像头的调试过程。从硬件环境准备(包括RK3588核心板、IMX415模块连接及测试工具)、软件环境配置(Linux 5.10内核、驱动状态确认),到设备树关键配置(MIPI链路、GPIO引脚、电源域等)都进行了详细说明。调试过程中通过dmesg日志、media-ctl拓扑分析等工具验证了摄像头驱动加载和图像采集功能。最终实现了800万像素高清图像采集,总结了硬件连接验证、信号完整性优化等关键经验,为类似MIPI摄像头调试提供

flypig has a dream! 882

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

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

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

【数字IC验证快速入门】26、SystemVerilog项目实践之AHB-SRAMC(6)(AHB-SRAMC SVTB Overview)

导读:作者有幸在中国电子信息领域的排头兵院校“电子科技大学”攻读研究生期间,接触到前沿的数字IC验证知识,旁听到诸如华为海思、清华紫光、联发科技等业界顶尖集成电路相关企业面授课程,对数字IC验证有了一些知识积累和学习心得。为帮助想入门前端IC验证的朋友,思忱一二后,特开此专栏,以期花最短的时间,走最少的弯路,学最多的IC验证技术知识。 文章目录一、内容概述二、AHB-SRAMC 验证计划 一、内容概述 AHB-SRAMC 验证计划 AHB-SRAMC 验证平台的架构图 AHB-SRAMC 验证平台的代.

悟已往之不谏 知来者之可追 2651

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

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

水水哥哟哟的博客 413

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

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

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

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

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

midnight_time的博客 448

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

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

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

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

visio安装包

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

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

余额充值