我是靠谱客的博主 虚拟万宝路,最近开发中收集的这篇文章主要介绍【414简单】第三大的数,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

【414简单】第三大的数(2021.10.6)

1. 问题描述

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

示例1:

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

示例2:

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

示例3:

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

提示:

  • 1 < = n u m s . l e n g t h < = 1 0 4 1 <= nums.length <= 10^4 1<=nums.length<=104
  • − 2 31 < = n u m s [ i ] < = 2 31 − 1 -2^{31} <= nums[i] <= 2^{31} - 1 231<=nums[i]<=2311
2. 解题思路

对数组进行遍历,记录其中第一、第二、第三大的数,并实时更新。

==注意:==数组中可能会出现INT_MIN,所以单纯使用INT_MIN来表示最大的三个数的初始值是不够的,需要有个flag标志位,用来判断thirdMax的值是不是更新得到的INT_MIN

3.代码
class Solution {
public:
int thirdMax(vector<int>& nums) {
int max = INT_MIN, secondMax = INT_MIN,thirdMax = INT_MIN;
// falg和f用于作为标志位
int flag = 0;
bool f = false;
for(auto num: nums) {
if (num == INT_MIN&&!f) {
flag++;
f = true;
}
if(num > max) {
flag++;
thirdMax = secondMax;
secondMax = max;
max = num;
} else if(num < max && num > secondMax) {
flag++;
thirdMax = secondMax;
secondMax = num;
} else if(num < secondMax && num > thirdMax) {
flag++;
thirdMax = num;
}
}
return flag >= 3 ? thirdMax : max;
}
};
4. 复杂度

时间复杂度:O(n),n表示数组的长度

最后

以上就是虚拟万宝路为你收集整理的【414简单】第三大的数的全部内容,希望文章能够帮你解决【414简单】第三大的数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部