描述

给定一个长度为 n 的可能有重复值的数组,找出其中不去重的最小的 k 个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4(任意顺序皆可)。
数据范围:0\le k,n \le 100000≤k,n≤10000,数组中每个数的大小0 \le val \le 10000≤val≤1000
要求:空间复杂度 O(n)O(n) ,时间复杂度 O(nlogn)O(nlogn)

方法:优先队列、迭代器、lambda表达式

import java.util.*;

public class Solution {
//堆的使用、lambda表达式的使用、迭代器的使用
public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
ArrayList<Integer> res = new ArrayList<>();
if(input.length == 0 || k == 0) {
return res;
}
//怎么判断是大根堆还是小根堆,目的是大根堆
PriorityQueue<Integer> queue = new PriorityQueue<>((a, b) -> b - a);
for(int i = 0; i < input.length; i++) {
if(queue.size() < k) {
queue.add(input[i]);
} else if(queue.peek() > input[i]) {
queue.poll();
queue.add(input[i]);
}
}
Iterator<Integer> iterator = queue.iterator();
while(iterator.hasNext()) {
res.add(iterator.next());
}
return res;
}
}

要保证堆的大小不能超过K,然后遍历数组,因为是最大堆,也就是堆顶元素是堆中最大的,如果遍历的元素小于堆顶元素,就把堆顶元素给移除,然后再把当前遍历的元素加入到堆中,最后在把堆中元素转化为数组即可。

怎么判断是大根堆:(a,b) -> b - a,小-大

最新文章

  1. 桥接模式/bridge模式/对象结构型
  2. (六)Maven之pom.xml文件简单说明
  3. SQL 基本知识
  4. Web API应用支持HTTPS的经验总结
  5. jQuery 实现菜单
  6. 开源 VS 商业,消息中间件你不知道的那些事
  7. VisualStudio2013内置SQLServer入门
  8. 基于visual Studio2013解决面试题之0202上下排
  9. 在gem5的full system下运行 x86编译的测试程序 running gem5 on ubuntu in full system mode in x86
  10. wpf通过VisualTreeHelper找到控件内所有CheckBox和TextBox并做相应绑定
  11. 宝塔服务器面板 部署 thinkphp5 坑
  12. Vuejs的一些总结
  13. python中sys和os模块的使用
  14. uvm_pre_do
  15. python装饰器(新年第一写)
  16. Java反射,参数为数组
  17. leetcode 300最长上升子序列
  18. 转头条:阿里p7架构师:三年经验应该具备什么样的技能?
  19. 斯坦福大学CS224d课程目录
  20. nginx负载均衡技术的优缺点

热门文章

  1. Elasticsearch:Cluster备份 Snapshot及Restore API
  2. 使用Metricbeat监控zookeeper遇到的问题
  3. Alermanager_template,email
  4. Elasticsearch 趋势科技实战分享笔记
  5. SpringBoot项目的CI配置 # 安全变量
  6. Docker网络详细理解-容器网络互通
  7. 修改NodePort的范围
  8. centos 安装mysql 8.0
  9. Netty 学习(五):服务端启动核心流程源码说明
  10. SpringBoot的starter到底是什么?