題目:
給你一個整數數組 nums 和一個整數 k ,請你返回其中出現頻率前 k 高的元素。你可以按 任意順序 返回答案。
示例:
輸入: nums = [1,1,1,2,2,3], k = 2
輸出: [1,2]
解題思路:
要返回出現頻率前k高的元素,那么我們首先肯定要知道每個元素出現的次數,我們可以借助Map來實現。
有了所有元素的出現次數,我們只需要知道出現的最高次數maxCnt,然后創建一個長度為maxCnt+1的數組buckets用來存儲出現次數相同的元素。buckets[i]表示出現次數為i的所有元素。
最后倒序遍歷bucket,輸出前k個元素即可。
class Solution {public int[] topKFrequent(int[] nums, int k) {// 1、用Map統計每個元素出現的次數Map<Integer, Integer> cntMap = new HashMap<>();for(int num : nums){cntMap.merge(num, 1, (oldVal, newVal) -> oldVal + newVal);}// 2、計算最大的出現次數int maxCnt = Collections.max(cntMap.values());// 3、定義長度為maxCnt+1的list數組,每個數組元素用來存放出現次數相同的元素集合List<Integer>[] buckets = new ArrayList[maxCnt+1];Arrays.setAll(buckets, i -> new ArrayList<>());for(Map.Entry<Integer, Integer> e : cntMap.entrySet()){buckets[e.getValue()].add(e.getKey());}// 4、倒序遍歷buckets,把出現次數前k大的元素加入答案int[] ans = new int[k];int j = 0;for(int i = maxCnt; i >= 0 && j < k; i--){for(int x : buckets[i]){ans[j++] = x;}}return ans;}
}