【414简单】第三大的数

该博客介绍了一个算法问题,即在给定的非空整数数组中找到第三大的数。当数组中不存在第三大的数时,返回最大的数。解决方案是通过遍历数组,实时更新最大、次大和第三大的数,并用特殊标志处理特殊情况。算法的时间复杂度为O(n)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【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<=nums.length<=1041 <= nums.length <= 10^41<=nums.length<=104
  • −231<=nums[i]<=231−1-2^{31} <= nums[i] <= 2^{31} - 1231<=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表示数组的长度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值