Skip to content

Commit c437489

Browse files
committed
Add k most frequent elements using quick select
1 parent 02cd35e commit c437489

File tree

2 files changed

+94
-1
lines changed

2 files changed

+94
-1
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ Short sample programs to demonstrate the inbuilt object oriented concepts in Jav
9696

9797
| Maths | Link | Java | C++|
9898
|:--|:--|:--|:--|
99-
| Top K frequent elements | [Link](https://leetcode.com/explore/interview/card/top-interview-questions-medium/110/sorting-and-searching/799/) | ? | [Using hashmap and sorting](sites/leetcode/FrequentElements.cpp) <br/> [Using hashmap and priority queue](sites/leetcode/FrequentElements.cpp) |
99+
| Top K frequent elements | [Link](https://leetcode.com/explore/interview/card/top-interview-questions-medium/110/sorting-and-searching/799/) | ? | [Using hashmap and sorting](sites/leetcode/FrequentElements.cpp) <br/> [Using hashmap and priority queue](sites/leetcode/FrequentElements.cpp) <br/> [Using Quick Select](sites/leetcode/FrequentElementsQuickSelect.cpp) |
100100
| | [Link]() | ? | []() |
101101

102102
<br/>
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
// Top K frequent elements
2+
// https://leetcode.com/explore/interview/card/top-interview-questions-medium/110/sorting-and-searching/799/
3+
4+
#include <iostream>
5+
#include <vector>
6+
#include <algorithm>
7+
#include <unordered_map>
8+
#include <cstdlib>
9+
10+
void print(const std::vector<int>& numbers)
11+
{
12+
if (numbers.empty()) {
13+
return;
14+
}
15+
for (auto num : numbers) {
16+
std::cout << num << " ";
17+
}
18+
std::cout << "\n";
19+
}
20+
21+
int partition(const int left, const int right, const int kSmallest,
22+
std::vector<int>& uniqueKeys, std::unordered_map<int, int>& freqMap)
23+
{
24+
int pivotFrequency = freqMap[uniqueKeys[kSmallest]];
25+
std::swap(uniqueKeys[kSmallest], uniqueKeys[right]);
26+
27+
int storeIndex = left;
28+
for (int i = left; i <= right; ++i) {
29+
if (freqMap[uniqueKeys[i]] < pivotFrequency) {
30+
std::swap(uniqueKeys[i], uniqueKeys[storeIndex]);
31+
storeIndex += 1;
32+
}
33+
}
34+
std::swap(uniqueKeys[right], uniqueKeys[storeIndex]);
35+
return storeIndex;
36+
}
37+
38+
void quickselect(const int left, const int right, const int kSmallest,
39+
std::vector<int>& uniqueKeys, std::unordered_map<int, int>& freqMap)
40+
{
41+
if (left == right) {
42+
return;
43+
}
44+
45+
int pivotIndex = left + std::rand() % (right - left + 1);
46+
pivotIndex = partition(left, right, pivotIndex, uniqueKeys, freqMap);
47+
if (pivotIndex == kSmallest) {
48+
return;
49+
} else if (kSmallest < pivotIndex) {
50+
quickselect(left, pivotIndex - 1, kSmallest, uniqueKeys, freqMap);
51+
} else {
52+
quickselect(pivotIndex + 1, right, kSmallest, uniqueKeys, freqMap);
53+
}
54+
}
55+
56+
std::vector<int> topKFrequent(std::vector<int>& numbers, const int k)
57+
{
58+
std::unordered_map<int, int> freqMap;
59+
60+
for (auto num : numbers) {
61+
freqMap[num]++;
62+
}
63+
64+
size_t n = freqMap.size();
65+
std::vector<int> uniqueKeys {};
66+
for (auto p : freqMap) {
67+
uniqueKeys.push_back(p.first);
68+
}
69+
70+
quickselect(0, n - 1, n - k, uniqueKeys, freqMap);
71+
std::vector<int> kFrequent(k);
72+
std::copy(uniqueKeys.begin() + n - k, uniqueKeys.end(), kFrequent.begin());
73+
74+
return kFrequent;
75+
}
76+
77+
int main()
78+
{
79+
std::vector<int> numbers {3, 1, 4, 4, 5, 2, 6, 1};
80+
std::cout << "Numbers : ";
81+
print(numbers);
82+
83+
std::cout << "---------------------------------------\n";
84+
int k = 2;
85+
std::cout << "Top "<< k << " frequent numbers : \n";
86+
87+
std::vector<int> frequent = topKFrequent(numbers, k);
88+
print(frequent);
89+
90+
std::cout << "=======================================\n";
91+
92+
return 0;
93+
}

0 commit comments

Comments
 (0)