[更文刷题] 414. 第三大的数

152 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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) 的解决方案吗?

二、思路分析:

  1. 总体思路定义三个值:max,nextMax,thirdMax,循环一次,看每个数与这三个值的关系;
  2. 在总体思路上,先解决赋初值的问题,本题解选择最简单的方式Nums[0];
  3. 下面要解决的是怎么依次传递的问题:
    • 如果比最大值还大,则依次向下传递;
    • 如果比最大值小,比nextMax大,则从nextMax向下传递;
    • 如果比最大值小,比nextMax小,比thirdMax大,则直接赋值给thirdMax。
  4. 关于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;
}

范文参考:

414. 第三大的数 - 第三大的数 - 力扣(LeetCode)

【ACM金牌题解】set & 观察变量 | 编程熊 - 第三大的数 - 力扣(LeetCode)