zoukankan      html  css  js  c++  java
  • [LeetCode] 347. Top K Frequent Elements

    Given a non-empty array of integers, return the k most frequent elements.

    Example 1:

    Input: nums = [1,1,1,2,2,3], k = 2
    Output: [1,2]
    

    Example 2:

    Input: nums = [1], k = 1
    Output: [1]

    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频率的数

    解法一,利用排序,我们构造一个数据结构记录每个数的值和频率(类似的思想可以开一个堆,用堆操作)

    class Solution {
        private class node implements Comparable<node>{
            public int num;
            public int freq;
            public node(int num, int freq) {
                this.num = num;
                this.freq = freq;
            }
            @Override
            public int compareTo(node o) {
                if (this.freq < o.freq)
                    return 1;
                if (this.freq > o.freq)
                    return -1;
                return 0;
            }
        }
        public List<Integer> topKFrequent(int[] nums, int k) {
            HashMap<Integer, Integer> map = new HashMap<>();
            for(int n: nums){
                map.put(n, map.getOrDefault(n,0)+1);
            }
            List<Integer> res = new ArrayList<>(k);
            node[] nodes = new node[map.size()];
            int i = 0;
            for (Map.Entry entry: map.entrySet()) {
                int num = (int) entry.getKey();
                int freq = (int) entry.getValue();
                node nd = new node(num, freq);
                nodes[i] = nd;
                i++;
            }
            Arrays.sort(nodes);
            for (i = 0; i < k; i++) {
                res.add(nodes[i].num);
            }
            return res;
        }
    }

    解法二:利用TreeMap,TreeMap是基于红黑树的,自排序,注意一点就是你要排序的对象就行了

    public class Solution {
        public List<Integer> topKFrequent(int[] nums, int k) {
            HashMap<Integer, Integer> map = new HashMap<>();
            for(int n: nums){
                map.put(n, map.getOrDefault(n,0)+1);
            }
    
            TreeMap<Integer, List<Integer>> fremap = new TreeMap<>();
            for (int num : map.keySet()) {
                if (!fremap.containsKey(map.get(num))) {
                    fremap.put(map.get(num), new LinkedList<>());
                }
                fremap.get(map.get(num)).add(num);
            }
    
            List<Integer> res = new ArrayList<>();
            
    
            while (res.size() < k) {
                Map.Entry<Integer, List<Integer>> entry = fremap.pollLastEntry();
    
                res.addAll(entry.getValue());
                
            }
            return res;
        }
    }
  • 相关阅读:
    Vagrant命令
    您必须知道的 Git 分支开发规范
    phpstorm的提速设置
    Flex 布局教程:语法篇
    Bootstrap 3 & 4 的多级下拉菜单示例
    申请快递查询100接口
    vue.js组件与组件之间的通信
    MAMP环境下 cookie无法正常使用
    Git 常用命令
    Linux学习笔记之yum安装mysql5.7
  • 原文地址:https://www.cnblogs.com/Moriarty-cx/p/9788445.html
Copyright © 2011-2022 走看看