LeetCode 347. 前 K 個高頻元素
阿新 • • 發佈:2020-11-02
class Solution { public int[] topKFrequent(int[] nums, int k) { //使用HashMap統計每個元素出現的次數,元素為鍵,元素出現的頻次為值 HashMap<Integer,Integer> map = new HashMap<>(); for(int num : nums){ if(map.containsKey(num)){ map.put(num,map.get(num) + 1); }else{ map.put(num,1); } } //桶排序 //將頻次作為陣列的下標,對於出現頻次不同的數字集合,存入相應的陣列下標 List<Integer>[] buckets = new ArrayList[nums.length + 1]; for(int key : map.keySet()){ //獲取出現的次數作為下標 int i = map.get(key); if(buckets[i] == null){ buckets[i] = new ArrayList(); } buckets[i].add(key); } // topK用於儲存 頻率前K高的元素 List<Integer> topK = new ArrayList(); //倒序遍歷陣列獲取出現順序從大到小的排列 for(int i = buckets.length - 1;i >= 0 && topK.size() < k;i--){if(buckets[i] == null) { continue; }; //如果buckets[i]的容量 小於k - topK.size(),全放到topK List中 if(buckets[i].size() <= (k - topK.size())){ topK.addAll(buckets[i]); }else{ //容量不夠了,放 0 ~ k - topK.size()個 topK.addAll(buckets[i].subList(0,k - topK.size())); } } //定義結果集res,將List轉為陣列輸出 int[] res = new int[k]; for(int i =0;i < k;i++){ res[i] = topK.get(i); } return res; } }