• [LeetCode] 347. Top K Frequent Elements 解题思路


    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;
        }
    }
  • 相关阅读:
    LintCode-Search for a Range
    LintCode-Serialization and Deserialization Of Binary Tree
    LeetCode-Reverse Words in a String
    LeetCode-Reorder List
    LeetCode-Word Break
    LeetCode-Word Ladder
    LeetCode-Valid Palindrome
    cf div2 237 D
    POJ 1759
    cf div2 238 D
  • 原文地址:https://www.cnblogs.com/TonyYPZhang/p/5479972.html
Copyright © 2020-2023  润新知