414. 第三大的数 - 力扣(LeetCode) 典型的topk,优先级队列,不过这儿需要处理重复元素,可以使用哈希表自动去重
class Solution { public: int thirdMax(vector<int>& nums) { unordered_set<int> s(nums.begin(), nums.end()); int n = s.size(); if(n < 3) return *max_element(s.begin(), s.end()); priority_queue<int, vector<int>, greater<int>> q;//小顶堆 auto it = s.begin(); for(int i = 0; i < 3; ++i){ q.push(*it); ++it; } while(it != s.end()){ if(*it > q.top()){ q.pop(); q.push(*it); } ++it; } return q.top(); } };其实直接使用set自动排序就可以了。
也可以使用三个变量维护:
class Solution { public: int thirdMax(vector<int>& nums) { long m1 = -3e9, m2 = -3e9, m3 = -3e9;//m1 > m2 > m3 for (const auto &x : nums) { if (x == m1 || x == m2 || x == m3) continue; if (x > m1) { m3 = m2; m2 = m1; m1 = x; } else if (x > m2) { m3 = m2; m2 = x; } else if (x > m3) m3 = x; } if (m3 == -3e9) return m1; else return m3; } };