每日一题:414. 第三大的数

75 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第16天,点击查看活动详情

一、题目描述:

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

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

示例 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) 的解决方案吗?

二、思路分析:

先定义三个变量来存取最大,次大,第三大的数,因为要避免负数的情况,所以先把三个变量定义为long型,初始值设为无穷小,当数组中有数字大于max,将这个数赋给max,当数组中有数字小于max且大于mid时,将这个数赋给mid,当数组中有数字小于mid大于third时,将这个数赋给third。再分情况讨论,如果third仍然等于无穷小,则说明没有第三大的数,所以返回max。否则就直接返回third,第三大的数字。

三、AC 代码:

public class Solution {
    public int ThirdMax(int[] nums) {
    long max=long.MinValue;
    long mid=long.MinValue;
    long third=long.MinValue;
    for(int i=0;i<nums.Length;i++){
    if(nums[i]>max){
        third=mid;
        mid=max;
        max=nums[i];
    }
    else if(nums[i]<max&&nums[i]>mid){
        third=mid;
        mid=nums[i];
    }
    else if(nums[i]<mid&&nums[i]>third){
        third=nums[i];
    }
    }
    if(third==long.MinValue){
        return (int)max;
    }
    else{
        return (int)third;
    }

}
}

参考

一次循环,3个变量作为过滤器,时间复杂度O(n),空间复杂度O(3) - 第三大的数 - 力扣(LeetCode)

利用HashMap的键的覆盖性,可有效地对原来的数组进行降重 - 第三大的数 - 力扣(LeetCode)