持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第15天,点击查看活动详情
一、题目描述:
414. 第三大的数 - 力扣(LeetCode) (leetcode-cn.com)
给你一个非空数组,返回此数组中 第三大的数 。如果不存在,则返回数组中最大的数。
示例 1:
输入:[3, 2, 1]
输出:1
解释:第三大的数是 1 。
示例 2:
输入:[1, 2]
输出:2
解释:第三大的数不存在, 所以返回最大的数 2 。
示例 3:
输入:[2, 2, 3, 1]
输出:1
解释:注意,要求返回第三大的数,是指在所有不同数字中排第三大的数。
此例中存在两个值为 2 的数,它们都排第二。在所有不同数字中排第三大的数为 1 。
提示:
- 1 <= nums.length <= 10^4
- -2^31 <= nums[i] <= 2^31 - 1
进阶: 你能设计一个时间复杂度 O(n) 的解决方案吗?
二、思路分析:
- 总体思路定义三个值:max,nextMax,thirdMax,循环一次,看每个数与这三个值的关系;
- 在总体思路上,先解决赋初值的问题,本题解选择最简单的方式Nums[0];
- 下面要解决的是怎么依次传递的问题:
- 如果比最大值还大,则依次向下传递;
- 如果比最大值小,比nextMax大,则从nextMax向下传递;
- 如果比最大值小,比nextMax小,比thirdMax大,则直接赋值给thirdMax。
- 关于Flag,用于标记是初值还是非初值。
三、AC 代码:
int thirdMax(int* nums, int numsSize){
if(numsSize==1)return nums[0];
if(numsSize==2)return nums[0] > nums[1] ? nums[0] : nums[1];
int max = nums[0];
int nextMax = nums[0];
int thirdMax = nums[0];
int flag = 1;
for(int i=0;i<numsSize;i++){
if(nums[i]>max){
thirdMax = nextMax;
nextMax = max;
max = nums[i];
flag++;
}else if(nums[i]<max){
if(flag==1){
nextMax = nums[i];
flag++;
}else if(flag==2){
if(nums[i]>nextMax){
thirdMax = nextMax;
nextMax = nums[i];
flag++;
}else if(nums[i]<nextMax){
thirdMax = nums[i];
flag++;
}
}else{
if(nums[i]>nextMax){
thirdMax = nextMax;
nextMax = nums[i];
flag++;
}else if(nums[i]<nextMax){
if(nums[i]>thirdMax){
thirdMax = nums[i];
flag++;
}
}
}
}
}
if(flag>=3)return thirdMax;
else return max;
}