版权声明:本文为博主原创文章,欢迎大家转载,但是要注明我的文章地址。 https://blog.csdn.net/program_developer/article/details/82771686
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.
我的解法:桶排序(Bucket Sort)时间复杂度O(n)。
1. 遍历数组nums,利用HashMap统计各元素出现次数。
2. 遍历HashMap,利用嵌套列表ArrayList记录出现次数为i( i∈[1, n] )的所有元素
3. 逆序遍历ArrayList,将其中的前k个元素输出。
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Leet347Top_K {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] array = {1,1,1,2,2,3};
List<Integer> res = topKFrequent(array, 2);
for (int a : res) {
System.out.print(a + " ");
}
}
public static List<Integer> topKFrequent(int[] nums, int k){
//计算每一个元素出现的次数
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
for(int num : nums) {
if(map.containsKey(num)) {
map.put(num, map.get(num)+1);
} else {
map.put(num, 1);
}
}
//得到最频繁出现的
int max = 0;
for(Map.Entry<Integer, Integer> entry : map.entrySet()) {
max = Math.max(max, entry.getValue());
}
//初始化一个ArrayList。索引是出现的次数,ArrayList的值是数。
ArrayList<Integer>[] arr = (ArrayList<Integer>[]) new ArrayList[max + 1];
for(int i=1; i<=max; i++) {
arr[i] = new ArrayList<Integer>();
}
for(Map.Entry<Integer, Integer> entry: map.entrySet()){
int count = entry.getValue();
int number = entry.getKey();
arr[count].add(number);
}
List<Integer> result = new ArrayList<Integer>();
//add most frequent numbers to result
for(int j=max; j>=1; j--){
if(arr[j].size()>0){
for(int a: arr[j]){
result.add(a);
//if size==k, stop
if(result.size()==k){
return result;
}
}
}
}
return null;
}
}