[LeetCode] 347. Top K Frequent Elements 解題思路 - Java


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;
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM