• Leetcode: 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.

    很像majority element III, 但是那道题有O(k) extra space的限制,这里没有。有任意extra space, 同时知道elem range情况下,bucket sort最节省时间

    语法上注意第5行,建立一个ArrayList的array,后面没有泛型generic

    List[] bucket = new List[nums.length + 1];  or

    List<Integer>[] = new List[nums.length + 1];

    Time Complexity: O(N)

     1 class Solution {
     2     public List<Integer> topKFrequent(int[] nums, int k) {
     3         List<Integer> res = new ArrayList<>();
     4         if (nums == null || nums.length == 0) return res;
     5         
     6         Map<Integer, Integer> map = new HashMap<Integer, Integer>();
     7         for (int num : nums) {
     8             if (map.containsKey(num)) {
     9                 map.put(num, map.get(num) + 1);
    10             }
    11             else map.put(num, 1);
    12         }
    13         
    14         List[] bucket = new List[nums.length + 1];
    15         
    16         for (int key : map.keySet()) {
    17             int freq = map.get(key);
    18             if (bucket[freq] == null) {
    19                 bucket[freq] = new ArrayList<Integer>();
    20             }
    21             bucket[freq].add(key);
    22         }
    23         
    24         for (int i = bucket.length - 1; i >= 0; i --) {
    25             if (bucket[i] == null) continue;
    26             if (bucket[i].size() + res.size() > k) break;
    27             res.addAll(bucket[i]);
    28         }
    29         return res;
    30     }
    31 }

    方法2: MaxHeap, 用map.entrySet(), return Map.Entry type, 可以调用getKey() 和 getValue()

    Time Complexity: O(NlogN)

     1 public class Solution {
     2     public List<Integer> topKFrequent(int[] nums, int k) {
     3         List<Integer> res = new ArrayList<Integer>();
     4         Map<Integer, Integer> freqMap = new HashMap<Integer, Integer>();
     5         
     6         for (int elem : nums) {
     7             if (freqMap.containsKey(elem)) {
     8                 freqMap.put(elem, freqMap.get(elem)+1);
     9             }
    10             else {
    11                 freqMap.put(elem, 1);
    12             }
    13         }
    14 
    15         Comparator<Map.Entry<Integer, Integer>> comp = new Comparator<Map.Entry<Integer, Integer>>() {
    16             public int compare(Map.Entry<Integer, Integer> entry1, Map.Entry<Integer, Integer> entry2) {
    17                 return entry2.getValue() - entry1.getValue();
    18             }
    19         };
    20         
    21         PriorityQueue<Map.Entry<Integer, Integer>> maxHeap = new PriorityQueue<Map.Entry<Integer, Integer>>(11, comp);
    22         
    23         for (Map.Entry<Integer, Integer> each : freqMap.entrySet()) {
    24             maxHeap.offer(each);
    25         }
    26         
    27         for (int i=1; i<=k; i++) {
    28             res.add(maxHeap.poll().getKey());
    29         }
    30         return res;
    31     }
    32 }
  • 相关阅读:
    分享AWS网站
    centos7划分vlan
    在docker容器上如何实现代码的版本管理
    在docker私有仓库如何查看有哪些镜像?
    centos7下报错: import requests ImportError: No module named requests
    Unity2018.4.7导出Xcode工程报错解决方案
    1.OpenGL mac开发环境搭建记录
    unity 模板测试 详解
    游戏战争迷雾
    Unity 移动平台自己编写Shader丢失问题
  • 原文地址:https://www.cnblogs.com/EdwardLiu/p/6096328.html
Copyright © 2020-2023  润新知