Skip to content

Commit b339da9

Browse files
Add files via upload
1 parent f63d19e commit b339da9

File tree

1 file changed

+109
-0
lines changed

1 file changed

+109
-0
lines changed
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
// Runtime: 20 ms, faster than 82.72% of C++ online submissions for Top K Frequent Elements.
2+
// Memory Usage: 11.5 MB, less than 48.54% of C++ online submissions for Top K Frequent Elements.
3+
4+
class Solution
5+
{
6+
public:
7+
vector<int> topKFrequent(vector<int>& nums, int k)
8+
{
9+
// 构建哈希字典
10+
unordered_map<int, int> hashMap;
11+
for (int item : nums)
12+
{
13+
if (hashMap.find(item) == hashMap.end())
14+
hashMap.insert(pair<int, int>(item, 1));
15+
else
16+
++hashMap.at(item);
17+
}
18+
19+
vector<pair<int, int>> vec, minHeap;
20+
for (auto item : hashMap) vec.push_back(item);
21+
for (int i = 0; i < k; ++i) minHeap.push_back(vec[i]);
22+
23+
// 定义匿名函数 这里是不允许使用auto的,所以面试的时候还是要谨慎使用
24+
bool (*comp)(const pair<int, int>&, const pair<int, int>&) = \
25+
[](const pair<int, int> &item1, const pair<int, int> &item2){return item1.second > item2.second;};
26+
27+
// 建立最小堆
28+
make_heap(minHeap.begin(), minHeap.end(), comp);
29+
30+
// 遍历插入
31+
for (int index = k; index < vec.size(); ++index)
32+
{
33+
if (minHeap[0].second < vec[index].second)
34+
{
35+
pop_heap(minHeap.begin(), minHeap.end(), comp);
36+
minHeap.pop_back();
37+
38+
minHeap.push_back(vec[index]);
39+
push_heap(minHeap.begin(), minHeap.end(), comp);
40+
}
41+
}
42+
43+
// 得到最终的结果
44+
vector<int> res;
45+
for (int i = 0; i < k; ++i)
46+
{
47+
pop_heap(minHeap.begin(), minHeap.end(), comp);
48+
res.push_back(minHeap.back().first);
49+
minHeap.pop_back();
50+
}
51+
return res;
52+
}
53+
};
54+
55+
56+
// 优化代码
57+
// Runtime: 20 ms, faster than 82.72% of C++ online submissions for Top K Frequent Elements.
58+
// Memory Usage: 11.3 MB, less than 83.31% of C++ online submissions for Top K Frequent Elements.
59+
60+
class Solution
61+
{
62+
public:
63+
vector<int> topKFrequent(vector<int>& nums, int k)
64+
{
65+
// 构建哈希字典
66+
unordered_map<int, int> hashMap;
67+
for (int item : nums)
68+
{
69+
if (hashMap.find(item) == hashMap.end())
70+
hashMap.insert(pair<int, int>(item, 1));
71+
else
72+
++hashMap.at(item);
73+
}
74+
75+
vector<pair<int, int>> minHeap;
76+
unordered_map<int, int>::iterator iter = hashMap.begin();
77+
for (int i = 0; i < k; ++i, ++iter) minHeap.push_back(*iter);
78+
79+
// 定义匿名函数 这里是不允许使用auto的,所以面试的时候还是要谨慎使用
80+
bool (*comp)(const pair<int, int>&, const pair<int, int>&) = \
81+
[](const pair<int, int> &item1, const pair<int, int> &item2){return item1.second > item2.second;};
82+
83+
// 建立最小堆
84+
make_heap(minHeap.begin(), minHeap.end(), comp);
85+
86+
// 遍历插入
87+
for (; iter != hashMap.end(); ++iter)
88+
{
89+
if (minHeap[0].second < iter->second)
90+
{
91+
pop_heap(minHeap.begin(), minHeap.end(), comp);
92+
minHeap.pop_back();
93+
94+
minHeap.push_back(*iter);
95+
push_heap(minHeap.begin(), minHeap.end(), comp);
96+
}
97+
}
98+
99+
// 得到最终的结果
100+
vector<int> res;
101+
for (int i = 0; i < k; ++i)
102+
{
103+
pop_heap(minHeap.begin(), minHeap.end(), comp);
104+
res.push_back(minHeap.back().first);
105+
minHeap.pop_back();
106+
}
107+
return res;
108+
}
109+
};

0 commit comments

Comments
 (0)