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; } };
进击的小🐴农