欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

leetcode 414.第三大的数

程序员文章站 2022-03-07 19:44:55
...

leetcode 414.第三大的数

题目描述

给定一个非空数组,返回此数组中第三大的数。如果不存在,则返回数组中最大的数。要求算法时间复杂度必须是O(n)。

示例 1:

输入: [3, 2, 1]
输出: 1
解释: 第三大的数是 1.

示例 2:

输入: [1, 2]
输出: 2
解释: 第三大的数不存在, 所以返回最大的数 2 .

示例 3:

输入: [2, 2, 3, 1]
输出: 1
解释: 注意,要求返回第三大的数,是指第三大且唯一出现的数。
存在两个值为2的数,它们都排第二。

解题思路

方法一: 题目要求要使用时间复杂度为O(n),可以通过三次遍历的方法,依次查找,可以获得第三大的数。

class Solution {
public:
    int thirdMax(vector<int>& nums) {
        int num1 = INT_MIN, num2 = INT_MIN, num3 = INT_MIN;
        // 最大的数
        for(int i=0; i<nums.size(); i++){
            if(num1 <= nums[i]){
                num1 = nums[i];
            }
        }
        // 第二大的数
        for(int i=0; i<nums.size(); i++){
            if((num1 != nums[i]) && (num2 <= nums[i])){
                num2 = nums[i];
            }
        }
        // 第三大的数,这里需要确定是否存在num3,如果存在,flag变为true
        bool flag = false;
        for(int i=0; i<nums.size(); i++){
            if((num1 != nums[i]) && (num2 != nums[i]) && (num3 <= nums[i])){
                num3 = nums[i];
                flag = true;
            }
        }
        return flag ? num3 : num1;
    }
};

方法二 创建一个数组,有顺序的存放三个数,遍历数组的过程中,不断的取更新数组中的元素;c++ stl中提供了set容器,系统会根据元素的值自动排序。

class Solution {
public:
    int thirdMax(vector<int>& nums) {
        set<int> numsSet;
        // 不断更新set中的值
        for(int i=0; i<nums.size(); i++){
            numsSet.insert(nums[i]);
            if (numsSet.size() > 3){
                numsSet.erase(numsSet.begin());
            }
        }
		// set的长度小于3,返回最大值,长度等于3就返回最小值。
        if(numsSet.size() < 3){
            return *(--numsSet.end());
        }
        else{
            return *numsSet.begin();
        }
    }
};

简化代码(rbegin是反向迭代器)

class Solution {
public:
    int thirdMax(vector<int>& nums) {
        set<int> numsSet(nums.begin(), nums.end());
        auto it = numsSet.rbegin();
        if(numsSet.size() < 3){
            return *numsSet.rbegin();
        }
        else{
            return *(++(++numsSet.rbegin()));
        }
    }
};

欢迎大家关注我的个人公众号,同样的也是和该博客账号一样,专注分享技术问题,我们一起学习进步
leetcode 414.第三大的数