leetcode-347-Top-K-Frequent-Elements

描述


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

For example,
Given [1,1,1,2,2,3] and k = 2, return [1,2].

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.

分析


排序+哈希表,或者用堆解决。

解决方案1(C++)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
bool compare(pair<int, int> &a, pair<int, int> &b) {
return a.second > b.second;
}

class Solution {
public:
vector<int> topKFrequent(vector<int>& nums, int k) {
vector<int> result;
unordered_map<int, int> map_int_int;
vector<pair<int, int>> for_sort;

for(auto &item: nums) {
map_int_int[item]++;
}

for(auto &item: map_int_int) {
for_sort.push_back(make_pair(item.first, item.second));
}

sort(for_sort.begin(), for_sort.end(), compare);

for(int i = 0; i < k; i++) {
result.push_back(for_sort[i].first);
}
return result;
}
};

解决方案2(Golang)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
func topKFrequent(nums []int, k int) []int {
numCountMap := map[int]int{}

var result []int

for _, num := range nums {
if _, ok := numCountMap[num]; !ok {
result = append(result, num)
}
numCountMap[num] += 1
}

sort.Slice(result, func(i, j int) bool {
return numCountMap[result[i]] > numCountMap[result[j]]
})
return result[:k]
}

相关问题


题目来源