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