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 堆是一种常用的数据结构.二叉堆是一个特殊的二叉树,他的父亲节点比两个儿 ...
随机推荐
- Top 出海 AI 公司招技术!HIX.AI & Pollo.ai | 深圳
HIX.AI & Pollo.ai 招聘高级海外 AI 产品经理 (25-45K) 岗位职责: 负责Web 端海外 AI 产品的规划与策划,负责产品需求分析及原型设计,并制定方案推动产品研发落 ...
- Java WatchService监控指定路径下的文件新增、删除和修改(子文件夹、指定文件类型)
WatchService 是 Java NIO 包 (java.nio.file) 中提供的一个用于监控文件系统变化的 API.它允许应用程序监听目录中的文件创建.修改和删除事件. 基本原理 Watc ...
- 【Java】Java UDP 套接字编程乱码问题
零.发现问题 用Java写了个UDP收发程序,发现中文有问题! package socket; import java.io.IOException; import java.net.Datagram ...
- D的SDK的设置
有点烦,被困扰.看大虾的文章一并感谢: 进入D:\Users\Public\Documents\Embarcadero\Studio\22.0\CatalogRepository\AndroidSDK ...
- verilog利用线性插值实现正弦波生成器(dds)
verilog实现线性插值实现正弦波生成器 最近在项目上遇到一个需要在低资源FPGA上实现FFT逻辑的项目,而且要求实现窗函数.对于窗函数来说,莫非是实现正弦波生成器,正弦波生成器可以利用DDS模 ...
- 2024 蓝桥杯模拟赛3(div1+div2)
2024 蓝桥杯模拟赛3(div1+div2) P8834 [传智杯 #3 决赛] 序列 简单的模拟,数据范围很小,暴力即可 点击查看代码 #include <bits/stdc++.h> ...
- Scrcpy使用入门
1.下载Scrcpy GitHub地址:https://github.com/Genymobile/scrcpy 网盘地址:https://pan.baidu.com/s/1NKosSkQJLbmhz ...
- @Transactional的属性
@Transactional的属性: isolation-Isolation:事务的隔离级别(与并发相关) noRollbackFor-Class[]:那些异常,事务可以不回滚 noRollbackF ...
- gRPC 和传统 RPC 有啥不一样?一篇讲清楚!
现在大家做系统开发,都喜欢搞"微服务架构"--简单说就是把一个大系统拆成很多小服务,这样更灵活也更容易扩展.那这些服务之间怎么沟通呢?就得靠一种技术叫 RPC(远程过程调用).今天 ...
- MySQL清理binlog的正确姿势
本位主要讲述如何正确的清理 MySQL的binlog,里面有哪些坑,注意点有什么. 一. 为什么要清理binlog 如果没有设置MySQL的binlog过期时间或者设置的时间过长, 会 ...