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.
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/top-k-frequent-elements
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
用一个map存放每个元素的出现次数。再用一个数组,下标等于出现的次数。再从后往前遍历此数组。
class Solution {
public int[] topKFrequent(int[] nums, int k) {
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i = 0; i < nums.length; i++) {
if (map.containsKey(nums[i])) {
map.put(nums[i], map.get(nums[i]) + 1);
} else {
map.put(nums[i], 1);
}
}
List<Integer> []record = new List[nums.length];
for (int key: map.keySet()) {
int value = map.get(key);
if (record[value] == null) {
record[value] = new ArrayList<Integer>();
}
record[value].add(key);
}
int []ans = new int[k];
int ansCount = 0;
for (int i = record.length; i >= 0 && ansCount <=k ; i--) {
if (record[i] != null) {
for (int j : record[i]) {
ans[ansCount] = j;
ansCount++;
if (ansCount == k) {
break;
}
}
}
}
return ans;
}
}