【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]<=231−1
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简单】第三大内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复