• 347. 前K个高频元素


    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]

    这个题目更加像是一道语法题目。。。

    首先得知道map该如何遍历

    方式一 这是最常见的并且在大多数情况下也是最可取的遍历方式。在键值都需要时使用。

    1
    2
    3
    4
    Map<Integer, Integer> map = new HashMap<Integer, Integer>();
    for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
      System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
    }

    方法二 在for-each循环中遍历keys或values。

    如果只需要map中的键或者值,你可以通过keySet或values来实现遍历,而不是用entrySet。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    Map<Integer, Integer> map = new HashMap<Integer, Integer>();
    //遍历map中的键
    for (Integer key : map.keySet()) {
      System.out.println("Key = " + key);
    }
    //遍历map中的值
    for (Integer value : map.values()) {
      System.out.println("Value = " + value);
    }

    在Java中map的键值对Map.Entry对应c++中的pair。

    public List<Integer> topKFrequent(int[] nums, int k) {
            List<Integer> list = new ArrayList<>();
    
            PriorityQueue<Map.Entry<Integer, Integer>> pq = new PriorityQueue<>(new Comparator<Map.Entry<Integer, Integer>>() {
                @Override
                public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {
                    return o2.getValue() - o1.getValue();
                }
            });
    
            Map<Integer, Integer> map = new HashMap<>();
    
            for (int i = 0; i < nums.length; i++)
                if (map.containsKey(nums[i]))
                    map.put(nums[i], map.get(nums[i]) + 1);
                else
                    map.put(nums[i], 1);
    //        多此一举题目中不可能出现相同的键值对
    //        Set<Map.Entry<Integer, Integer>> set = map.entrySet();
    //
    //        for (Map.Entry<Integer, Integer> entry : set)
    //            pq.add(entry);
            for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
                pq.add(entry);
            }
            for (int i = 0; i < k; i++)
                list.add(pq.poll().getKey());
    
            return list;
        }
    

      Map.Entry的用法总结

    在TreeMap中,可以对key排序,但是无法对val排序。所以使用Map.Entry一般是需对val排序。Map.Entry一般是HashMap+某一种集合使用。下面介绍结合List使用。

        public static void main(String[] args) {
            Map<Integer,Integer> map=new HashMap<>();
            map.put(1,2);
            map.put(2,3);
            map.put(6,7);
            map.put(3,4);
            map.put(5,3);
            map.put(0,0);
            List<Map.Entry<Integer,Integer>> openTimes = new ArrayList<Map.Entry<Integer,Integer>>();
            for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
                openTimes.add(entry);
            }
            Collections.sort(openTimes, new Comparator<Map.Entry<Integer, Integer>>() {
                @Override
                public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {
                    return o1.getValue()-o2.getValue();
                }
            });
            for (Map.Entry<Integer,Integer> m:openTimes
                 ) {
                System.out.println(m.getKey()+"     "+m.getValue());
            }
    
        }
    

      

    加油啦!加油鸭,冲鸭!!!
  • 相关阅读:
    设计模式C++描述----06.适配器(Adapter)模式
    设计模式C++描述----05.职责链(Chain of Responsibility)模式
    设计模式C++描述----04.观察者(Observer)模式
    设计模式C++描述----03.工厂(Factory)模式
    设计模式的几种原则
    设计模式C++描述----02.模板(Template)模式
    常用 UML 类图
    前端插件之Bootstrap Switch 选择框开关控制
    Django处理流程
    Django之logging日志
  • 原文地址:https://www.cnblogs.com/clarencezzh/p/10938388.html
Copyright © 2020-2023  润新知