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]
.
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.
題目:給定一個非空數組,求出現次數最多的 k 個元素。
思路比較直接,
1. 將全部元素放到 Hashtable 里面,統計各個元素的出現次數
2. 將 Hashtable 里面的全部 Entry 拷貝一份到 List<Entry> 里面
3. 根據元素出現次數的值,對 List<Entry> 里面的元素進行排序
4. 將 List<Entry> 中出現次數的值最最大的前 k 個拷貝到一個新的 List<Integer> 中,得到結果
import static java.lang.System.out; import java.util.Collections; import java.util.Comparator; import java.util.Hashtable; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map.Entry; public class Solution { class Compartr implements Comparator<Entry<?, Integer>>{ @Override public int compare(Entry<?, Integer> o1, Entry<?, Integer> o2) { return o2.getValue().compareTo(o1.getValue()); } } public List<Integer> topKFrequent(int[] nums, int k) { Hashtable<Integer, Integer> key_cnt = new Hashtable<Integer, Integer>(); for(int key : nums){ if(key_cnt.containsKey(key)){ key_cnt.put(key, (Integer)key_cnt.get(key) + 1 ); }else{ key_cnt.put(key, 1); } } List<Entry<Integer, Integer>> list = new LinkedList<Entry<Integer, Integer>>(key_cnt.entrySet()); Compartr cpr = new Compartr(); Collections.sort(list, cpr); list.subList(k, list.size()).clear(); List<Integer> res = new LinkedList<Integer>(); Iterator<Entry<Integer, Integer>> iter = list.iterator(); int tmpk = k; while(iter.hasNext() && tmpk > 0){ Entry<Integer, Integer> entry = iter.next(); res.add(entry.getKey()); } return res; } }