【刷题打卡】414. 第三大的数

98 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第13天,点击查看活动详情

一、题目描述:

414. 第三大的数

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

示例 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

二、思路分析:

问题描述: 定义3个变量分别记录前3大的数,不容易初始化。如果初始化为INT_MIN,那么第3个变量如果最终是INT_MIN,则无法判定有没有取到第3大的数。

解决方案: 1、采用表示更大范围的long定义变量,就是要初始化为比所有数据都小且能比较的数。 2、采用3个int指针记录,用指针是否为nullptr判断是否取到第3个数 3、采用vector记录,利用vector.size()大小判定。

三、AC 代码:

class Solution {
public:
    int thirdMax(vector<int>& nums) {
        int *max1 = nullptr, *max2 = nullptr, *max3 = nullptr;
        
        for (int i=0; i<nums.size(); ++i){
            if (max1 == nullptr || nums[i] > *max1){
                max3 = max2;
                max2 = max1;
                max1 = &nums[i];
            }
            else if (nums[i] == *max1)
                continue;
            else if (max2 == nullptr || nums[i]>*max2){
                max3 = max2;
                max2 = &nums[i];
            }
            else if (nums[i] == *max2)
                continue;
            else if (max3 == nullptr || nums[i]>*max3)
                max3 = &nums[i];          
        }
        if (max3 == nullptr)
            return *max1;
        return *max3;        
    }
};
class Solution {
public:
    int thirdMax(vector<int>& nums) {
        vector<int> res;
        
        for (int i=0; i<nums.size(); ++i){
            if (res.size() < 3 || nums[i]>res[0])
                // 插入元素
                insertVector(res, nums[i]);
            
            if (res.size() > 3)
                // 维持res大小为3
                res.erase(res.begin());
        }
        
        if (res.size() < 3)
            return res[res.size()-1];
        return res[0];
    }
    
    void insertVector(vector<int>& res, int num){
        if (res.size()==0 || num>res[res.size()-1]){
            res.push_back(num);
            return;
        }
        
        for (auto it=res.begin(); it!=res.end(); ++it){
            if (num == *it)
                return;
            
            if (num < *it){
                res.insert(it, num);
                return;
            }
        }
    }
};