力扣-414.第三大的数(两种解法)

news2024/9/20 18:46:29

文章目录

    • 第三大的数
      • 解法一(排序加遍历对比)
      • 解法二(遍历一遍加迭代)


第三大的数

题目:

给你一个非空数组,返回此数组中第三大的数 。如果不存在,则返回数组中最大的数。

示例 1: 输入:[3, 2, 1] 输出:1
解释:第三大的数是 1 。

示例 2: 输入:[1, 2] 输出:2
解释:第三大的数不存在, 所以返回最大的数 2 。

示例 3: 输入:[2, 2, 3, 1] 输出:1
解释:注意,要求返回第三大的数,是指在所有不同数字中排第三大的数。 此例中存在两个值为
2 的数,它们都排第二。在所有不同数字中排第三大的数为 1 。

解法一(排序加遍历对比)

分析:

1.因为是要第三大的数,我们可以先判断数组的长度,如果为 1 则直接放回数组的第一个数,为2就判断哪个大在返回最大值。
2.当我们判断数组长度大于等于3后可以将它们进行降序排序,然后再用循环判断是否有三个数不相等(因为有可能整个数组都是同一个数或者是由两个数组成),然后再输出第三大的元素

在写代码之前我们先来简单介绍一个排序的库函数 qsort

对所指向的数组元素进行排序,每个元素的长度为字节,使用函数确定顺序。
此函数使用的排序算法通过调用指定的函数来比较元素对,并将指向元素的指针作为参数。
该函数不返回任何值,而是通过对数组的元素进行重新排序来修改所指向的数组的内容.

在这里插入图片描述
注意的是 compar函数的创建的格式和 qsort的一样: int (*compar)(const void*,const void*));//这个是自己创建的
在这里插入图片描述

qsort的使用

void qsort (void* base, size_t num, size_t size,   
 int (*compar)(const void*,const void*));

我们来实现一个整形排序

int hanshu(const void* p1,const void* p2) {//这里要按照qsort中的函数参数类型来写 
//int (*compar)(const void*,const void*));
	return  (*((int*)p1) - *((int*)p2));//返回-上面有解释  (int*)p1--强制转换为int类型指针
}
int main() {
	int arr[] = { 5,3,2,4,1 };
	int zs = sizeof(arr) / sizeof(arr[0]);//数组大小
	qsort(arr, zs, sizeof(arr[0]), hanshu);//按照规则填入, sizeof(arr[0])一个元素占多少字节
	for (int i = 0; i < zs; i++)//打印
		printf("%d ", arr[i]);
	return 0;
}

我们来看看运行结果:
在这里插入图片描述
成功完成排序
好,我们接下来就通过代码实现:

int te(const void* p1, const void* p2) {//排序判断大小的函数
	return *(( int*)p2) >*(( int*)p1);//返回 > 就交换
}

int thirdMax(int* nums, int numsSize) {
	if (numsSize == 1) {//判断长度
		return nums[0];
	}
	else if (numsSize == 2) {//判断长度,只有2个元素,判断大小再返回
		int max = nums[0];
		if (max < nums[1])
			max = nums[1];
		return max;
	}
	else {
		qsort(nums, numsSize, sizeof(int), te);//实现排序,一定要按照函数的格式放值
		int r = 0,t;//r是用来判断是否有三个不同的数,t是保留第三大数的下标的
		for (int j = 0; j < numsSize-1; j++) {
			if (nums[j] != nums[j + 1]) {//前后不一样r++
				r++;
				if (r == 2) {//当r==2时证明有三个不同的元素了,此时可以结束判断了
					t = j+1;//记录下标
					break;
				}
			}
}
		if (r != 2)//判断是否够三个数,不够直接返回最大值
			return nums[0];
		else//r==2返回第三大的元素
			return nums[t];
	}

}

以上就是第一种解法的详细代码和注释了

解法二(遍历一遍加迭代)

分析:

1.我们只要求前三大的元素,那么我们可以设置三个变量分别代表最大,第二,第三大的元素。
2.再对所有元素判断,判断在我们设置的三个变量的哪个区间里,再进行迭代
3.最后再判断第三大的变量是否被改变,要是被改变了就是返回改值,不然返回最大值

我们先介绍一下
int、long、longlong等的最大值和最小值的宏定义(部分)
头文件:<limits.h>

#define SHRT MIN	(-32768)//short-min
#define SHRT_MAX	32767	//short-max
#define USHRT_MAX	0xffff	//无符号 short-max
#define INT MIN	(-2147483647-1)//int-min	
#define INT_MAX	2147483647	//int-max
#define UINT_MAX	0xffffffff	//无符号 int-max
#define LONG MIN	(-2147483647L -1)//long-min	
#define LONG MAX	2147483647L	//long-max
#define ULONG_MAX	0xffffffffUL// 无符号long-man	
#define LLONG MAX	9223372036854775807i64	//long long-man
#define LLONG MIN	(-9223372036854775807i64 -1)//long long-min
#define ULLONG MAX	0xffffffffffffffffui64//无符号 longlong-max

代码:

int thirdMax(int* nums, int numsSize) {
 long a = LONG_MIN;//最大元素---这里用long是因为力扣那个案例里有大于int类型的值,LONG_MIN--long的最小值
 long b= LONG_MIN;//第二个大元素
 long c = LONG_MIN;//第三大元素
 for (int i = 0; i < numsSize; i++) {
	 if (nums[i] > a) {//比最大值都大,将数值由大往小交换
		 c = b;
		 b = a;
		 a = nums[i];
	}
	 else if (nums[i]<a && nums[i]>b) {//在最大值和第二大的中间,这时不动最大值,其他往下交换
		 c = b;
		 b = nums[i];
	 }
	 else if (nums[i]<b && nums[i]>c) {//在第二值和第三大的中间,这时不动最大值和第二大,将第三换掉
		 c = nums[i];
	 }
 }
 return c == LONG_MIN ? a : c;//判断第三个值是否是原值
}

以上就是第二种解法的详细代码和注释了

今天的分享就到这,谢谢大家观看!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1231231.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【VRTK】【VR开发】【Unity】7-配置交互能力和向量追踪

【前情提要】 目前为止,我们虽然设定了手模型和动画,还能够正确根据输入触发动作,不过还未能与任何物体互动。要互动,需要给手部设定相应的Interactor能力。 【配置Interactor的抓取功能】 在Hierarchy中选中[VRTK_CAMERA_RIGS_SETUP] ➤ Camera Rigs, Tracked Alias ➤ …

基于SSM的高校毕业选题管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

【JavaEE初阶】 CSS相关属性,元素显示模式,盒模型,弹性布局,Chrome 调试工具||相关讲解

文章目录 &#x1f38b;字体属性&#x1f6a9;设置字体&#x1f6a9;字体大小&#x1f6a9;字体粗细&#x1f6a9;文字样式 &#x1f38d;文本属性&#x1f6a9;文本颜色&#x1f388;认识 RGB&#x1f388;设置文本颜色 &#x1f6a9;文本对齐&#x1f6a9;文本装饰&#x1f6…

牛掰的dd命令,cpi0配合find备份(不会主动备份),od查看

dd if设备1或文件 of设备2或文件 blocknsize countn 还原就是把设备1,2调过来 这里想到dump的还原是命令restore&#xff0c;想起来就写一下&#xff0c;省的总忘记 可以针对整块磁盘进行复制&#xff0c;对于新创建的分区&#xff0c;也不用格式化&#xff0c;可以直接…

进程管理(五)

处理器调度及多级调度 批量型往往先进入外存,再进入内存。终端型直接进入内存。 从磁盘选择若干作业,同时装入到内存,创建相应的进程,这是高级调度。 低级调度(进程调度):从进入内存的多道程序中选择一道把处理机给他 注意:时间片轮转是抢占式的 外设的调度统称为…

多态语法详解

多态语法详解 一&#xff1a;概念1&#xff1a;多态实现条件 二:重写&#xff1a;三&#xff1a;向上转型和向下转型1:向上转型&#xff1a;1&#xff1a;直接赋值&#xff1a;2&#xff1a;方法传参3&#xff1a;返回值 2:向下转型 一&#xff1a;概念 1&#xff1a;同一个引…

AIGC ChatGPT 4 将数据接口文件使用Python进行入库Mysql

数据分析,数据处理的过程,往往将采集到的数据,或者从生产库过来的接口文件,我们都需要进行入库操作。 如下图数据: 将这样的数据接口文件,进行入库,插入到Mysql数据库中。 用Python代码来完成。 ChatGPT4来完成代码输入。 ChatGPT4完整内容如下: 这个任务可以使用`…

趣学python编程 (五、常用IDE环境推荐)

Python环境指的是在计算机上安装Python解释器和相关的库&#xff0c;它是运行Python代码所必需的。那么开始Python编程前&#xff0c;准备安装好开发环境是前提。 默认的电脑上只是让人办公使用的&#xff0c;不带python编程开发环境。只有安装python环境&#xff0c;才可以编写…

Mistral 7B 比Llama 2更好的开源大模型 (四)

Mistral 7B在平衡高性能和保持大型语言模型高效的目标方面迈出了重要的一步。通过我们的工作,我们的目标是帮助社区创建更实惠、更高效、更高性能的语言模型,这些模型可以在广泛的现实世界应用程序中使用。 Mistral 7B在实践中,对于16K和W=4096的序列长度,对FlashAttentio…

Nosql之redis概述及基本操作

关系数据库与非关系型数据库概述 关系型数据库 关系型数据库是一个结构化的数据库&#xff0c;创建在关系模型&#xff08;二维表格模型&#xff09;基础上&#xff0c;一般面向于记录。SQL语句(标准数据查询语言)就是一种基于关系型数据库的语言&#xff0c;用于执行对关系型…

云桌面 node_modules 切换艰辛历程记录 rebuild失败记录

拿到node_modules后更换 执行npm rebuild 重新构建 报错 node版本不一致 nvm切换 版本 不成功 换个窗口又变回原来版本号了 设置默认版本 nvm alias default 14.16.1 发现下面还有一个stable的还指向原来版本 nvm alias stable 14.16.1 rebuild 还是失败 逐个rebuild 每个依赖单…

【Java 进阶篇】Ajax 实现——JQuery 实现方式 `get` 与 `post`

嗨&#xff0c;亲爱的小白们&#xff01;欢迎来到这篇关于使用 jQuery 实现 Ajax 请求的博客。在前端开发中&#xff0c;Ajax 是一项非常重要的技术&#xff0c;它使我们能够在不刷新整个页面的情况下与服务器进行数据交互。而在 jQuery 中&#xff0c;get 和 post 方法提供了简…

应试教育导致学生迷信标准答案惯性导致思维僵化-移动机器人

移动机器人课程群实践创新的困境与突围 一、引言 随着科技的快速发展&#xff0c;工程教育变得越来越重要。然而&#xff0c;传统的应试教育模式往往侧重于理论知识的传授&#xff0c;忽视了学生的实践能力和创新精神的培养。这在移动机器人课程群的教学中表现得尤为明显。本文…

【Java 进阶篇】Ajax 实现——原生JS方式

大家好&#xff0c;欢迎来到这篇关于原生 JavaScript 中使用 Ajax 实现的博客&#xff01;在前端开发中&#xff0c;我们经常需要与服务器进行数据交互&#xff0c;而 Ajax&#xff08;Asynchronous JavaScript and XML&#xff09;是一种用于创建异步请求的技术&#xff0c;它…

企业级SSD还是一个巨大的蓝海~

根据Allied Market Research市场分析报告显示&#xff0c;2020 年全球企业级 SSD 市场规模为 178.5 亿美元&#xff0c;预计到 2030 年将达到 468.9 亿美元&#xff0c;2021 年至 2030 年的复合年增长率为 10.2%。 扩展阅读&#xff1a;华为展望&#xff5c;2030年数据中心存储…

mysql面试题——存储引擎相关

一&#xff1a;MySQL 支持哪些存储引擎? MySQL支持多种存储引擎&#xff0c;比如InnoDB&#xff0c;MyISAM&#xff0c; MySQL大于等于5.5之后&#xff0c;默认存储引擎是InnoDB 二&#xff1a;InnoDB 和 MyISAM 有什么区别? InnoDB支持事务&#xff0c;MyISAM不支持InnoD…

Redis-核心数据结构

五种数据结构 String结构 String结构应用场景 Hash结构 Hash结构应用场景 List结构 List结构应用场景 Set结构 Set结构应用场景 ZSet有序结构 ZSet有序结构应用场景

基于SSM的供电公司安全生产考试系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

ES6中实现继承

本篇文章主要说明在ES6中如何实现继承&#xff0c;学过java的小伙伴&#xff0c;对class这个关键字应该不陌生&#xff0c;ES6中也提供了class这个关键字作为实现类的语法糖&#xff0c;咱们一起实现下ES6中的继承。 实现思路 首先直接通过class来声明一个Teacther类&#xff…

《微信小程序开发从入门到实战》学习二十二

3.3 开发创建投票页面 3.3.10 使用switch开关组件 用switch开关组件增加一个设置是否匿名投票的功能。 switch常用属性如下&#xff1a; checked 开还是关&#xff0c;默认false关 disabled 是否禁用&#xff0c;默认false不禁用&#xff0…