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
  • 相关阅读:
    其他技术----mongoDB基础
    redis学习----Redis入门
    网络通信学习----HTTP请求方法
    spring boot 学习 ---- spring boot admin
    java拓展----(转)synchronized与Lock的区别
    spring boot 学习 ---- spring MVC
    解决ubuntu的apt-get命令被占用
    阴暗
    图像分割实战-视频背景替换
    「知乎」你们觉得响应式好呢,还是手机和PC端分开来写?
  • 原文地址:https://www.cnblogs.com/immiao0319/p/9410490.html
Copyright © 2011-2022 走看看