hot100之堆
虽然更多用的是桶
数组中的第k个最大元素(215)
桶排序
class Solution {
public int findKthLargest(int[] nums, int k) {
int[] buckets = new int[200001];
for (int i = 0; i < nums.length; i++){
buckets[nums[i]+10000]++;
}
for (int i = 20000; i >= 0; i--){
k -= buckets[i];
if (k <= 0){
return i - 10000;
}
}
return 0;
}
}
选择排序
class Solution {
public int findKthLargest(int[] nums, int k) {
List<Integer> numList = new ArrayList<>();
for (int num : nums){
numList.add(num);
}
return quickSelect(numList, k);
}
private int quickSelect(List<Integer> nums, int k){
Random rand = new Random();
int midd = nums.get(rand.nextInt(nums.size()));
List<Integer> big = new ArrayList<>();
List<Integer> sma = new ArrayList<>();
for (int num : nums){
if (num > midd){
big.add(num);
}
else if (num < midd){
sma.add(num);
}
}
if (k <= big.size()) return quickSelect(big, k);
else if (nums.size() < k + sma.size()) return quickSelect(sma, k + sma.size() - nums.size());
return midd;
}
}
- 分析
桶排序
nums[i] 只有 10⁴, 便毅然决然的打表了 , 很坏啊击败了90%
选择排序
随机选择数组中的一个数作为中轴, 通过比较k落在中轴左端还是右端, 进一步缩小范围
前k个高频元素
class Solution {
public int[] topKFrequent(int[] nums, int k) {
int n = nums.length;
Map<Integer, Integer> num_buckets = new HashMap<>();
for (int num : nums){
num_buckets.merge(num, 1, Integer::sum);
}
int max_nums = Collections.max(num_buckets.values());
List<Integer>[] freq_buckets = new ArrayList[max_nums+1];
Arrays.setAll(freq_buckets, i -> new ArrayList<>());
for (Map.Entry<Integer, Integer> entry : num_buckets.entrySet){
freq_buckets[entry.getValue()].add(entry.getKey());
}
int[] res = new int[k];
int count = 0;
for (int i = max_nums; count < k && i >= 0; i--){
for (int num : freq_buckets[i]) res[count++] = num;
}
return res;
}
}
- 分析
以每个<整数>分桶, 再以<频率>对整数分桶
选择 hash而不是 int[] → 元素重复数量大
数据流的中位数(295)
class MedianFinder {
private PriorityQueue<Integer> lef = new PriorityQueue<>((a,b) -> b-a); //大堆
private PriorityQueue<Integer> rig = new PriorityQueue<>(); //小堆
public MedianFinder() {
}
public void addNum(int num) {
if(lef.size() == rig.size()){
rig.offer(num);
lef.offer(rig.poll());
}else{
lef.offer(num);
rig.offer(lef.poll());
}
}
public double findMedian() {
if (lef.size() != rig.size()){
return lef.peek();
}
return (lef.peek() + rig.peek()) / 2.0;
}
}
- 分析
排序部分 - > addNum先在对端排序, 取出对端的 最小\最大 值
取中位数部分- > 当总数为奇数时, 以lef.peek()作为中位数, 需要保持 lef.size() ≥ rig.size()
hot100之堆的更多相关文章
- Java 堆内存与栈内存异同(Java Heap Memory vs Stack Memory Difference)
--reference Java Heap Memory vs Stack Memory Difference 在数据结构中,堆和栈可以说是两种最基础的数据结构,而Java中的栈内存空间和堆内存空间有 ...
- [数据结构]——堆(Heap)、堆排序和TopK
堆(heap),是一种特殊的数据结构.之所以特殊,因为堆的形象化是一个棵完全二叉树,并且满足任意节点始终不大于(或者不小于)左右子节点(有别于二叉搜索树Binary Search Tree).其中,前 ...
- 《徐徐道来话Java》:PriorityQueue和最小堆
在讲解PriorityQueue之前,需要先熟悉一个有序数据结构:最小堆. 最小堆是一种经过排序的完全二叉树,其中任一非终端节点数值均不大于其左孩子和右孩子节点的值. 可以得出结论,如果一棵二叉树满足 ...
- 计算机程序的思维逻辑 (47) - 堆和PriorityQueue的应用
45节介绍了堆的概念和算法,上节介绍了Java中堆的实现类PriorityQueue,PriorityQueue除了用作优先级队列,还可以用来解决一些别的问题,45节提到了如下两个应用: 求前K个最大 ...
- JVM学习(2)——技术文章里常说的堆,栈,堆栈到底是什么,从os的角度总结
俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及到的知识点总结如下: 堆栈是栈 JVM栈和本地方法栈划分 Java中的堆,栈和c/c++中的堆,栈 数据结构层面的堆,栈 os层面 ...
- 数据结构:优先队列 基于堆实现(python版)
#!/usr/bin/env python # -*- coding:utf-8 -*- ''' Author: Minion-Xu ''' #异常类 class HeapPriQueueError( ...
- 数据结构:堆排序 (python版) 小顶堆实现从大到小排序 | 大顶堆实现从小到大排序
#!/usr/bin/env python # -*- coding:utf-8 -*- ''' Author: Minion-Xu 小堆序实现从大到小排序,大堆序实现从小到大排序 重点的地方:小堆序 ...
- Java中堆内存和栈内存详解2
Java中堆内存和栈内存详解 Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,ja ...
- AC日记——二叉堆练习3 codevs 3110
3110 二叉堆练习3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 给定N(N≤500,000)和N个整 ...
- codevs 2879 堆的判断
codevs 2879 堆的判断 http://codevs.cn/problem/2879/ 题目描述 Description 堆是一种常用的数据结构.二叉堆是一个特殊的二叉树,他的父亲节点比两个儿 ...
随机推荐
- CentOS7图形化界面和命令行界面之间的转换
最近在学习Lunix操作系统下的CentOS7系统,参考了网页上大多数的资料并进行在自己的亲身实践,最终想要记录一下我在CentOS7系统中有关命令行和图形化界面之间的转换.1.查看当前的默认界面形式 ...
- Delphi 增加/获得windows用户帐号
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...
- Linux如何从命令行卡死的进程中退出?
Linux如何从命令行卡死的进程中退出? 不知道大家在使用Linux的时候,会不会遇到一些命令,有可能卡顿,有可能执行时间过长(比如使用 find 查找某个文件),这个时候我不想继续执行这个命令了,说 ...
- D常用快捷键大全(转)
Ctrl+PageUp将光标移至本屏的第一行,屏幕不滚动.Ctrl+PageDown将光标移至本屏的最后一行,屏幕不滚动.Ctrl+↓向下滚动屏幕,光标跟随滚动不出本屏.Ctrl+↑向上滚动屏幕,光标 ...
- Kubernetes基础教程-通过部署Nginx快速学习基本使用命令
1.验证节点信息 1.1.查看控制平面组件的状态 [root@linux-servertwo software]# kubectl get cs Warning: v1 ComponentStatus ...
- SpringAI用嵌入模型操作向量数据库!
嵌入模型(Embedding Model)和向量数据库(Vector Database/Vector Store)是一对亲密无间的合作伙伴,也是 AI 技术栈中紧密关联的两大核心组件,两者的协同作用构 ...
- 生命游戏Delphi实现
生命游戏,康威生命游戏(Game of Life),剑桥大学约翰·何顿·康威设计的计算机程序. 生命游戏没有游戏玩家各方之间的竞争,也谈不上输赢,可以把它归类为仿真游戏.事实上,也是因为它模拟和显示的 ...
- Asp.net mvc基础(三)View的查找
1.指定转到的视图 View("指定的视图名称"); 优先于寻找Action方法名称可以创建的视图的文件夹,如果没有,就去View文件夹下的Shared文件夹寻找指定的视图名称. ...
- FreeSWITCH中SIP网关(Gateway)操作
freeswitch是一款简单好用的VOIP开源软交换平台. 以下是一篇关于FreeSWITCH中SIP网关(Gateway)操作的技术指南,基于提供的官方文档内容整理: 一.网关生命周期管理 1. ...
- Vue横向滚动鼠标控制
let level_cards // 标记可移动 , move_start // 移动初始的x位置 , move_x // 移动初始的容器偏移量 , move_scroll_left // 判断是否为 ...