题目要求:求前K个最频繁出现的数字。

1.很容易想到,使用HashMap<Integer,Integer>来存储<number,frequency>键值对

1         int n = nums.length;
2 Map<Integer, Integer> map = new HashMap<>(n);
3
4 for (int num : nums) {
5 map.put(num, map.getOrDefault(num, 0) + 1);
6 }

2.接下来非常自然的思路就是:

  • 对<number,frequency>按照frequency进行降序排序
  • 返回前k个<number,frequency>的number

  根据题目的黑字提示:“你可以按 任意顺序 返回答案。”。可以计算出第K频繁的数的frequency,接着遍历map,返回所有frequency >= Kth的number即可:

 1         Integer[] temp = map.values().toArray(new Integer[map.size()]);
2 Arrays.sort(temp);
3 int[] ans = new int[k];
4 int KthCount = temp[temp.length - k], i = 0;
5
6 for (Map.Entry<Integer, Integer> kv : map.entrySet()) {
7 if (kv.getValue() >= KthCount) {
8 ans[i++] = kv.getKey();
9 }
10 }

因为时间超过5%,想到了对map遍历时是否可以直接遍历map中的键值对,于是:

1         for (Map.Entry<Integer, Integer> kv : map.entrySet()) {
2 if (kv.getValue() >= KthCount) {
3 ans[i++] = kv.getKey();
4 }
5 }

进阶的时间要求想不出来,于是看了题解,有了以下收获:

题目最终需要返回的是前 kk 个频率最大的元素,可以想到借助堆这种数据结构,对于 kk 频率之后的元素不用再去处理,进一步优化时间复杂度。

  • 求前 k 大,用小根堆,求前 k 小,用大根堆

    •         PriorityQueue<int[]> minHeap = new PriorityQueue<>(k,
      new Comparator<int[]>() {
      @Override
      public int compare(int[] o1, int[] o2) {
      //升序
      return o1[1] - o2[1];
      //降序
      return o2[1] - o1[1];
      }
      });


  • topk (前k大)用小根堆,维护堆大小不超过 k 即可。每次压入堆前和堆顶元素比较,如果比堆顶元素还小,直接扔掉,否则压入堆。检查堆大小是否超过 k,如果超过,弹出堆顶。复杂度是 nlogk
  • 避免使用大根堆,因为你得把所有元素压入堆,复杂度是 nlogn,而且还浪费内存。如果是海量元素,那就挂了。
        PriorityQueue<int[]> minHeap = new PriorityQueue<>(k,
new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[1] - o2[1];
}
}); int count = 0
for (Map.Entry<Integer, Integer> kv : map.entrySet()) {
//前K个键值对不需要判断
if (count++ < k) {
minHeap.add(new int[]{kv.getKey(), kv.getValue()});
} else if (kv.getValue() > minHeap.peek()[1]) {
minHeap.poll();
minHeap.add(new int[]{kv.getKey(), kv.getValue()});
}
}

leetcode347 —— n中topK && PriorityQueue(Heap) && Map遍历的更多相关文章

  1. 去除List集合中的重复对象,Map遍历代码

    /*** * 去除List<PartsInfoDTO>列表中的重复对象 ~!! * @param list * @return */ public static List<Parts ...

  2. jquery中的 ajax 以及map遍历

    1.语法 $.ajax{ type:'get',//类型 有get post url:'',//路径 data:{name:$('#ma').val(),nameq:$('#maq').val()}, ...

  3. js中三个对数组操作的函数 indexOf()方法 filter筛选 forEach遍历 map遍历

     indexOf()方法  indexOf()方法返回在该数组中第一个找到的元素位置,如果它不存在则返回-1. 不使用indexOf时 var arr = ['apple','orange','pea ...

  4. Java中Map遍历的四种方案

    在Java中如何遍历Map对象 方式一 这是最常见的并且在大多数情况下也是最可取的遍历方式.在键值都需要时使用. Map<Integer, Integer> map = new HashM ...

  5. java中Map遍历的四种方式

    在java中所有的map都实现了Map接口,因此所有的Map(如HashMap, TreeMap, LinkedHashMap, Hashtable等)都可以用以下的方式去遍历. 方法一:在for循环 ...

  6. Java集合中List,Set以及Map等集合体系详解

    转载请注明出处:Java集合中List,Set以及Map等集合体系详解(史上最全) 概述: List , Set, Map都是接口,前两个继承至collection接口,Map为独立接口 Set下有H ...

  7. Java中关于HashMap的元素遍历的顺序问题

    Java中关于HashMap的元素遍历的顺序问题 今天在使用如下的方式遍历HashMap里面的元素时 1 for (Entry<String, String> entry : hashMa ...

  8. map遍历的四种方式

    原文 http://blog.csdn.net/dayanxuqun/article/details/26348277 以下是map遍历的四种方式: // 一.推荐只用value的时候用,都懂的... ...

  9. ES6中的Set和Map集合

    前面的话 在ES6标准制定以前,由于可选的集合类型有限,数组使用的又是数值型索引,因而经常被用于创建队列和栈.如果需要使用非数值型索引,就会用非数组对象创建所需的数据结构,而这就是Set集合与Map集 ...

随机推荐

  1. 20210716 noip17

    考场 终于有一场在晚上考了 T1 随便画了画就发现要求每个点的后继个数,想起来有 dfs 和 toposort 两种方法,感觉很稳 T2 裸的网络流有 70pts?!真香 一看 T3 就想起了 Mst ...

  2. 算法:实现strStr(),字符串indexOf方法

    描述 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始).如果不存在,则返回  -1. 个人思路: ...

  3. 阶段总结-Java基础-超进阶

    Gitee项目地址:https://gitee.com/zc10010/java_interview_guide/tree/master/知识点话术 项目叫话术,但是我觉得作为知识点学习是挺不错的. ...

  4. python库--pymysql

    方法/类 返回值 参数 说明         .connect() ct 建立与mysql数据库的连接 host 数据库服务器所在的主机 user 用户名 password 密码 database 要 ...

  5. 制作Windows服务和安装程序(C#版)

    http://blog.sina.com.cn/s/blog_5f4ffa170100vt2b.html 1.创建服务项目: 打开VS 2005 编程环境,在C#中新建Windows服务程序 2.将安 ...

  6. 驱动IO模型-select

    新人学习,欢迎指正 部分select.c代码 应用层 select(maxfd+1,&rfds,NULL,NULL,NULL); -------------------(系统调用)------ ...

  7. PHP的命令行扩展Readline相关函数学习

    PHP 作为一个 Web 开发语言,相对来说,命令行程序并不是它的主战场.所以很多年轻的 PHP 开发者可能连命令行脚本都没有写过,更别提交互式的命令操作了.而今天,我们带来的这个扩展就是针对 PHP ...

  8. 变着花样来接参,PHP中接收外部参数的方式

    对于PHP这样一个web语言来说,接参是非常重要的一个能力.毕竟从前端表单或异步请求传递上来的数据都要获取到才能进行正常的交互展示.当然,这也是所有能够进行web开发的语言的必备能力.今天我们就来看看 ...

  9. symfony2显示调试工具栏

    1. app/config/config_dev.yml framework: templating: engines: ['twig'] router: resource: "%kerne ...

  10. Jmeter扩展组件开发(5) - 初始化方法的作用与实现

    CODE //URLNAME 就是在图形化界面当中显示的变量名称private static final String URLNAME = "URL";//设置界面当中默认显示的变 ...