LeetCode_414 Third Maximum Number(easy)

题意:

找出一列整数中的第三大的数,如果不存在,输出第一大。注意是第三大,所以[1,2,2,3]输出的结果是1.

思路:

最开始的时候想到用优先队列,小顶堆维护size不大于3。但是后面发现优先队列无法排除上面[1,2,2,3]数字相等的情况。

之后选择开一个大小为3的数组,然后if,else考虑所有可能的情况。虽然可以AC,但是还是笨了一点。看了Discuss里面的牛逼代码,用的是set维护。。。内部实现是平衡二叉树,多好的性质啊,即排重还有序。因为之前没用到过,没想到,受教了。

另外学习了以后priority_queue这么写:

priority_queue<int> que;//大顶堆
priority_queue<int,vector<int>,greater<int> > queue;//小顶堆

LeetCode上面的题目大多是面试题,所以直接在编辑框Coding更符合实际情况一些。另外Pick one真的挺好用的。

代码实现:

#include <queue>
#include <vector>

using std::vector;
using std::greater;
using std::swap;

class Solution {
public:
    int thirdMax(vector<int>& nums) {
        int lis[3];
        int cnt = 0;
        for( int i = 0; i < nums.size(); i++ ){
            if( cnt == 0 ){
                lis[cnt++] = nums[i];
            }
            else if( cnt == 3 ){
                if( nums[i] > lis[0] ){
                    lis[2] = lis[1];
                    lis[1] = lis[0];
                    lis[0] = nums[i];
                }
                else if( nums[i]>lis[1] && nums[i]!=lis[0] ){
                    lis[2] = lis[1];
                    lis[1] = nums[i];
                }
                else if( nums[i]>lis[2] && nums[i]!=lis[0] && nums[i]!=lis[1] ){
                    lis[2] = nums[i];
                }
            }
            else{
                if( cnt==1 && lis[0]!=nums[i] ){
                    lis[cnt++] = nums[i];
                    if( lis[0] < lis[1] ){
                        swap(lis[0],lis[1]);
                    }
                }
                else if( cnt==2 && lis[0]!=nums[i] && lis[1]!=nums[i] ){
                    lis[cnt++] = nums[i];
                    if( lis[0] < lis[2] ){
                        swap(lis[0],lis[2]);
                        swap(lis[1],lis[2]);
                    }
                    else if( lis[1] < lis[2] ){
                        swap(lis[1],lis[2]);
                    }
                }
            }
        }
        if( cnt == 3 ){
            return lis[2];
        }
        else{
            return lis[0];
        }
    }
};
set代码:

int thirdMax(vector<int>& nums) {
    set<int> top3;
    for (int num : nums) {
        top3.insert(num);
        if (top3.size() > 3)
            top3.erase(top3.begin());
    }
    return top3.size() == 3 ? *top3.begin() : *top3.rbegin();
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值