414. 第三大的数

题目:

 

 解答:

笨比O(N)算法,先用unordered_set去重,O(N)。再用小顶堆,所有元素push一遍,维持其size不大于3,这部分O(N*Log4)=O(N)。加起来还是O(N)。当然这只是理论时间复杂度。另外空间复杂度O(N)。

class Solution {
public:
    int thirdMax(vector<int>& nums) {
        if(nums.empty()){
            return -1;
        }
        unordered_set<int> s;
        for(const auto& num:nums){
            s.insert(num);
        }
        priority_queue<int,vector<int>,greater<int> > p;
        for(const auto& num:s){
            p.push(num);
            if(p.size()>3){
                p.pop();
            }
        }
        if(p.size()<3){
            while(p.size()>1){
                p.pop();
            }
            return p.top();
        }
        return p.top();
    }
};

 

 三个变量记录最大的三个值m1>m2>m3

三个值初始化为一个不可能出现的数

遍历nums中所有数字num

对于num与m1/m2/m3的不同大小关系分情况处理,记得更新大的值时小的值也要更新,比如现在m1=5, m2=3, m3=2。此时遍历到num=6,则更新m1=6,但值5丢了。应该:m3=m2,m2=m1,m1=num,其他情况以此类推。

时间复杂度O(N),空间复杂度O(1)

class Solution {
public:
    #define im -3414327
    int thirdMax(vector<int>& nums) {
        int m1,m2,m3;
        m1=m2=m3=im;
        for(const int& num:nums){
            if(num==m1 or num==m2 or num==m3){
                continue;
            }
            else if(m1!=im and num>m1 or m1==im){
                m3=m2;
                m2=m1;
                m1=num;
            }
            else if(num<m1 and (m2!=im and num>m2 or m2==im)){
                m3=m2;
                m2=num;
            }
            else if(num<m2 and (m3!=im and num>m3 or m3==im)){
                m3=num;
            }
        }
        return m3==im?m1:m3;
    }
};

 

posted @ 2020-07-19 03:25  NeoZy  阅读(102)  评论(0编辑  收藏  举报