【LeetCode】347. Top K Frequent Elements
阿新 • • 發佈:2018-12-10
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
我的解法:桶排序(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; } }