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].
这种解法用到了bucket sort,统计出各个数字出现的次数,再将其加入到对应count的bucket中,最后从后向前便利bucket。
另外可以用heap做,复杂度比这种解法高。
public class Solution { public List<Integer> topKFrequent(int[] nums, int k) { Map<Integer, Integer> valToCount = new HashMap<Integer, Integer>(); for (int num : nums) { valToCount.put(num, valToCount.getOrDefault(num, 0) + 1); } int bucketNumber = 0; for (int count : valToCount.values()) { bucketNumber = Math.max(bucketNumber, count); } ArrayList<Integer>[] buckets = (ArrayList<Integer>[]) new ArrayList[bucketNumber]; for (Map.Entry<Integer, Integer> entry : valToCount.entrySet()) { int index = entry.getValue()-1; if (buckets[index] == null) { buckets[index] = new ArrayList<Integer>(); } buckets[index].add(entry.getKey()); } List<Integer> result = new ArrayList<Integer>(); for (int i = bucketNumber - 1; i >= 0; i --) { if (buckets[i] != null) { for (int j = 0; j < buckets[i].size(); j++) { if (k == 0) { break; } k--; result.add(buckets[i].get(j)); } } } return result; } }