Leetcode 347: Top K Frequent Elements

dume0011
1 min readJan 16, 2021

--

Given a non-empty array of integers, return the k most frequent elements.

Example 1:

Input: nums = [1,1,1,2,2,3], k = 2
Output: [1,2]

Example 2:

Input: nums = [1], k = 1
Output: [1]

Note:

  • You may assume k is always valid, 1 ≤ k ≤ number of unique elements.
  • Your algorithm’s time complexity must be better than O(n log n), where n is the array’s size.
  • It’s guaranteed that the answer is unique, in other words the set of the top k frequent elements is unique.
  • You can return the answer in any order.

Problem Analysis:

We can count all elements’ frequency, return the k most frequent elements. For counting, we can use a hashmap, then using a priority queue to get the final elements

Solution:

class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
unordered_map<int, int> store;
for (const auto item: nums) store[item] += 1;
auto my_comp = [](const pair<int, int>& lhs, const pair<int, int>& rhs) {
return lhs.second > rhs.second;
};
priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(my_comp)> queue(my_comp);
for (const auto& item: store) {
if (queue.size() < k) {
queue.push(make_pair(item.first, item.second));
} else {
if (item.second > queue.top().second) {
queue.pop();
queue.push(make_pair(item.first, item.second));
}
}
}

vector<int> res(k, 0);
for (int i = 0; i < k; ++i) {
res[i] = queue.top().first;
queue.pop();
}

return res;
}
};

Time Complexity: O(max(n, klogk))

Space Complexity: O(n)

--

--