zoukankan      html  css  js  c++  java
  • 347. Top K Frequent Elements 最常用的k个元素

    [抄题]:

    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.

     [暴力解法]:

    时间分析:

    空间分析:

     [优化后]:

    时间分析:

    空间分析:

    [奇葩输出条件]:

    [奇葩corner case]:

    List<Integer>[] bucket列表组的空间是n+1,因为可能出现最小0次、最大n次的情况。

    [思维问题]:

    想不到木桶排序:统计出现次数相同的情况,所以可以用。空间是n+1,因为可能出现最小0次

    [英文数据结构或算法,为什么不用别的数据结构或算法]:

    bucket.length - 1 index其实就是出现的次数

    Map.getOrDefault(n, 0) 有就是一个,没有就是后一个

    [一句话思路]:

    [输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

    [画图]:

    [一刷]:

    1. if (bucket[i] != null)链表非空才能加,否则NPE

    [二刷]:

    [三刷]:

    [四刷]:

    [五刷]:

      [五分钟肉眼debug的结果]:

    [总结]:

    想不到木桶排序:统计出现次数相同的情况,所以可以用。

    [复杂度]:Time complexity: O(n) Space complexity: O(n)

    [算法思想:迭代/递归/分治/贪心]:

    [关键模板化代码]:

    [其他解法]:

    [Follow Up]:

    [LC给出的题目变变变]:

     [代码风格] :

     [是否头一次写此类driver funcion的代码] :

     [潜台词] :

    class Solution {
        public List<Integer> topKFrequent(int[] nums, int k) {
            //initialization: result, HashMap, List<Integer> [] Bucket
            List<Integer> result = new ArrayList<Integer>();
            HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
            List<Integer> [] bucket = new List[nums.length + 1];
            
            //corner case
            if (nums == null || nums.length == 0 || k <= 0) return result;
            
            //count the frequence into map
            for (int i = 0; i < nums.length; i++) {
                if (map.containsKey(nums[i])) {
                    int n = map.get(nums[i]);
                    map.put(nums[i], n + 1);
                }else {
                    map.put(nums[i], 1);
                }
            }
            
            //put all the map's key into Bucket
            for (int key : map.keySet()) {
                if (bucket[map.get(key)] == null) 
                    bucket[map.get(key)] = new ArrayList();
                bucket[map.get(key)].add(key);
            }
            
            //get answer from Bucket
            for (int i = bucket.length - 1; i >= 0 && result.size() < k; i--) {
                if (bucket[i] != null)
                result.addAll(bucket[i]);
            }
            
            //return
            return result;
        }
    }
    View Code
  • 相关阅读:
    ThinkPHP 3.2.2 实现持久登录 ( 记住我 )
    Java实现 LeetCode 20 有效的括号
    Java实现 LeetCode 20 有效的括号
    Java实现 LeetCode 19删除链表的倒数第N个节点
    Java实现 LeetCode 19删除链表的倒数第N个节点
    Java实现 LeetCode 19删除链表的倒数第N个节点
    Java实现 LeetCode 18 四数之和
    Java实现 LeetCode 18 四数之和
    Java实现 LeetCode 18 四数之和
    Java实现 LeetCode 17 电话号码的字母组合
  • 原文地址:https://www.cnblogs.com/immiao0319/p/9410490.html
Copyright © 2011-2022 走看看