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

文章目录

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


第三大的数

题目:

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

示例 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.mzph.cn/news/151578.shtml

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

相关文章

YOLOv8-seg改进:SEAM、MultiSEAM分割物与物相互遮挡、分割小目标性能

🚀🚀🚀本文改进:SEAM、MultiSEAM分割物体与物体相互遮挡性能 🚀🚀🚀SEAM、MultiSEAM分割物与物相互遮挡、分割小目标性能 🚀🚀🚀YOLOv8-seg创新专栏:http://t.csdnimg.cn/KLSdv 学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定科研; 1)手把手教你如何…

Java值传递和引用传递

在Java中&#xff0c;有值传递&#xff08;Pass-by-Value&#xff09;和引用传递&#xff08;Pass-by-Reference&#xff09;两种参数传递方式。 值传递&#xff08;Pass-by-Value&#xff09;&#xff1a;当使用值传递方式时&#xff0c;方法将参数的副本传递给调用方法。这意…

whisper使用方法

看这个 github https://github.com/Purfview/whisper-standalone-win/tags下载 视频提取音频 ffmpeg -i 222.mp4 -vn -b:a 128k -c:a mp3 output.mp3截取4秒后的音频 ffmpeg -i output.mp3 -ss 4 -c copy output2.mp3使用 whisper-faster.exe 生成字幕 whisper-faster.exe …

卷积神经网络(VGG-19)灵笼人物识别

文章目录 前期工作1. 设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09;我的环境&#xff1a; 2. 导入数据3. 查看数据 二、数据预处理1. 加载数据2. 可视化数据3. 再次检查数据4. 配置数据集5. 归一化 三、构建VGG-19网络1. 官方模型&#xff08;已打包好&#xff…

Zotero在word中插入带超链接的参考文献/交叉引用/跳转参考文献

Zotero以其丰富的插件而闻名&#xff0c;使用起来十分的带劲&#xff0c;最重要的是它是免费的、不卡顿&#xff0c;不像某专业软件。 然而Zotero在word插入参考文献时&#xff0c;无法为参考文献添加超链接&#xff0c;这是一个不得不提的遗憾。 不过&#xff0c;有大佬已经…

Windows SDK

Windows SDK (10.0.22621) for Windows 11&#xff0c;版本 22H2 (2023 年 10 月更新) 提供了用于生成 Windows 应用程序的最新标头、库、元数据和工具。 使用此 SDK 为Windows 11版本 22H2 和早期 Windows 版本生成通用 Windows 平台 (UWP) 和 Win32 应用程序。 Windows 应用…

武汉凯迪正大KDHG-220P互感器综合测试仪

主要特点 武汉凯迪正大KDHG-220P互感器综合测试仪&#xff0c;仅需进行简单的数字设定&#xff1a;设定互感器的额定参数。仪器将全过程自动记录数据&#xff0c;并自动将变比极性、伏安特性曲线等计算并显示出来&#xff0c;省去换线、手动调压、人工记录、整理、描曲线等烦琐…

openAI API简介 怎么写提示词获取更好的结果。prompt-engineering使用指南。人工智能的重大里程碑事件及技术创新chatGPT1

OpenAI API 几乎可以应用于任何任务。 包括内容或代码生成、摘要、对话、创意写作、图片生成、文本语音互转等。 关键概念 文本生成&#xff1a;提示&#xff0c;输入越精准&#xff0c;输出越精准。 获得更好结果的几种策略&#xff1a; 1.写出清晰的指令&#xff1a;包含…

【图数据库实战】HugeGraph图计算流程

HugeGraph是一款易用、高效、通用的开源图数据库系统&#xff08;Graph Database&#xff0c;GitHub项目地址&#xff09;&#xff0c; 实现了Apache TinkerPop3框架及完全兼容Gremlin查询语言&#xff0c; 具备完善的工具链组件&#xff0c;助力用户轻松构建基于图数据库之上的…

Docker之虚悬镜像(查看、删除)

虚悬镜像: 仓库名、标签都是的镜像&#xff0c;俗称dangling image 查看 docker image ls -f danglingtrue删除 虚悬镜像已经失去存在价值&#xff0c;可以删除 docker image prune

Spring注解开发

注解开发 注解开发定义bean 使用Component定义bean 核心配置文件中通过组件扫描加载bean Spring提供Component注解的三个衍生注解 Controller&#xff1a;用于表现层bean定义Service&#xff1a;用于业务层bean定义Repository&#xff1a;用于数据层bean定义 纯注解开发 Spr…

解决 requests 2.28.x 版本 SSL 错误

最近&#xff0c;在使用requests 2.28.1版本进行HTTP post传输时&#xff0c;您可能遇到了一个问题&#xff0c;即SSL验证失败并显示错误消息(Caused by SSLError(SSLCertVerificationError(1, [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get loc…

【FFmpeg实战】ffmpeg播放器-音视频解码流程

音视频介绍 音视频解码流程 FFmpeg解码的数据结构说明 AVFormatContext&#xff1a;封装格式上下文结构体,全局结构体,保存了视频文件封装格式相关信息AVInputFormat&#xff1a;每种封装格式&#xff0c;对应一个该结构体AVStream[0]&#xff1a;视频文件中每个视频&#xff…

LongAdder功能和原理

AtomicLong能保证并发情况下计数的准确性&#xff0c;其内部通过CAS来解决并发安全性的问题。 AtomicLong的缺点&#xff1a; 可以看到在高并发情况下&#xff0c;当有大量线程同时去更新一个变量&#xff0c;任意一个时间点只有一个线程能够成功&#xff0c;绝大部分的线程在尝…

自动驾驶学习笔记(十)——Cyber通信

#Apollo开发者# 学习课程的传送门如下&#xff0c;当您也准备学习自动驾驶时&#xff0c;可以和我一同前往&#xff1a; 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo Beta宣讲和线下沙龙》免费报名—>传送门 文章目录 前言 Cyber通信 编写代码 编译程序 运行…

FISCOBCOS入门(十)Truffle测试helloworld智能合约

本文带你从零开始搭建truffle以及编写迁移脚本和测试文件,并对测试文件的代码进行解释,让你更深入的理解truffle测试智能合约的原理,制作不易,望一键三连 在windos终端内安装truffle npm install -g truffle 安装truffle时可能出现网络报错,多试几次即可 truffle --vers…

人力资源小程序

人力资源管理对于企业的运营至关重要&#xff0c;而如今随着科技的发展&#xff0c;制作一个人力资源小程序已经变得非常简单和便捷。在本文中&#xff0c;我们将为您介绍如何通过乔拓云网制作一个人力资源小程序&#xff0c;只需五个简单的步骤。 第一步&#xff1a;注册登录乔…

基于单片机的自动循迹小车(论文+源码)

1.系统设计 此次基于单片机的自动循迹小车的设计系统&#xff0c;结合循迹模块来共同完成本次设计&#xff0c;实现小车的循迹功能&#xff0c;其其整体框架如图2.1所示。其中&#xff0c;采用STC89C52单片机来作为核心控制器&#xff0c;负责将各个传感器等模块链接起来&…

四旋翼无人机的飞行原理--【其利天下分享】

近年来&#xff0c;无人机在多领域的便捷应用促使其迅猛的发展&#xff0c;如近年来的多场战争&#xff0c;无人机的战场运用发挥得淋漓尽致。 下面我们针对生活中常见的四旋翼无人机的飞行原理做个基础的介绍&#xff0c;以飨各位对无人机有兴趣的朋友。 一&#xff1a;四旋翼…

基于变形卷积和注意机制的带钢表面缺陷快速检测网络DCAM-Net(论文阅读笔记)

原论文链接->DCAM-Net: A Rapid Detection Network for Strip Steel Surface Defects Based on Deformable Convolution and Attention Mechanism | IEEE Journals & Magazine | IEEE Xplore DCAM-Net: A Rapid Detection Network for Strip Steel Surface Defects Base…