1. 程式人生 > >347. Top K Frequent Elements/692. Top K Frequent Words

347. Top K Frequent Elements/692. Top K Frequent Words

[] 2-2 order val 需要 字符串比較函數 ica 單詞 frequency

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]


非常經典的一道題,有以下幾點:
1. 按照frequent 排序, 顯然要建立 num : freq 的 map對, 定義 map_freq<Integer,Integer> 來存放
2. 要把Map.Entry 放在PQ 裏,所以要定義PQ的 compartor 函數。 定義 PriorityQueue<Map.Entry<Integer, Integer>> ((o1,o2)->o2.getValue()-o1.getValue())
註意 Map.Entry()可以調用 getValue() 或者getKey()
3. map 裏獲取 key, value 或者 entry set的方法: map.keySet(), map.entrySet(). 註意value 可能會重復,因此不能叫valueSet,而是 map.values()

class Solution {
    public List<Integer> topKFrequent(int[] nums, int k) {
        
        Map<Integer,Integer> map = new HashMap<>();
        for(int num: nums){
            map.put(num,map.getOrDefault(num,0)+1);
        }
        
        PriorityQueue<Map.Entry<Integer,Integer>> queue = new
PriorityQueue<>((o1,o2) -> o2.getValue()-o1.getValue()); for(Map.Entry<Integer,Integer> entry : map.entrySet()){ queue.add(entry); } List<Integer> result = new ArrayList<>(); while(k > result.size()){ result.add(queue.poll().getKey()); }
return result; } }

692 和347 幾乎一樣,但這個是都單詞按照頻率排序,並且 “If two words have the same frequency, then the word with the lower alphabetical order comes first.” 如果兩個單詞頻率一樣,應該按照字母表順序排序。

這就需要在寫PriorityQueue compator 函數時註意一點:

PriorityQueue<Map.Entry<String,Integer>> ((o1,o2)-> o2.getValue() == o1.getValue()? o1.getKey.compareTo(o2.getKey()) : o2.getValue()-o1.getValue() ) ;

註意: 字符串比較函數是 s1.compareTo(s2).

class Solution {
    public List<String> topKFrequent(String[] words, int k) {
        
        Map<String, Integer> map_freq = new HashMap<>();
        for(String word: words){
            map_freq.put(word,map_freq.getOrDefault(word,0)+1);
        }
        
        PriorityQueue<Map.Entry<String,Integer>> max_heap = new PriorityQueue<>((o1,o2)-> (o2.getValue() ==o1.getValue()? o1.getKey().compareTo(o2.getKey()) :o2.getValue()-o1.getValue())  );
        
        for(Map.Entry<String,Integer> entry : map_freq.entrySet()){
            max_heap.add(entry);
        }
        
        List<String> result = new ArrayList<>();
        while(k>result.size()){
            result.add(max_heap.poll().getKey());
        }        
        return result;
    }
}

347. Top K Frequent Elements/692. Top K Frequent Words