数据流中的第k大元素的golang实现
设计一个找到数据流中第K大元素的类(class)。注意是排序后的第K大元素,不是第K个不同的元素。
你的 KthLargest 类需要一个同时接收整数 k 和整数数组nums 的构造器,它包含数据流中的初始元素。每次调用 KthLargest.add,返回当前数据流中第K大的元素。
int k = ;
int[] arr = [,,,];
KthLargest kthLargest = new KthLargest(, arr);
kthLargest.add(); // returns 4
kthLargest.add(); // returns 5
kthLargest.add(); // returns 5
kthLargest.add(); // returns 8
kthLargest.add(); // returns 8
这道题我们可以想到使用优先队列来做,优先队列的长度为K,按照从小到大排序,那么取出第K大的就是取出下标为0的值
首先我们构造一个小顶堆的数据结构

type KthLargest struct {
PriorityQueue []int //优先队列
Size int //小顶堆的容量
}
func Constructor(k int, nums []int) KthLargest {
var ks KthLargest
ks.Size = k
for index := ; index < len(nums); index++ {
ks.Add(nums[index])
}
return ks
}
func (this *KthLargest) Add(val int) int {
if len(this.PriorityQueue) < this.Size {
this.PriorityQueue = append(this.PriorityQueue, val)
} else if this.PriorityQueue[] <= val {
this.PriorityQueue = this.PriorityQueue[:]
this.PriorityQueue = append(this.PriorityQueue, val)
}
sort.Ints(this.PriorityQueue)
return this.PriorityQueue[]
}
这里是一个耗时的做法,因为这里每次添加元素的时候,我们都会去排序,把堆内元素最小的放在最前
而我们可以通过实现golang中的堆的几个接口来自定义我们的堆类型
type intHeap []int //下面几个方法是实现head的接口
func (h intHeap) Len() int {
return len(h)
} func (h intHeap) Less(i, j int) bool {
return h[i] < h[j]
} func (h intHeap) Swap(i, j int) {
h[i], h[j] = h[j], h[i]
}
func (h *intHeap) Push(x interface{}) {
// Push 使用 *h,是因为
// Push 增加了 h 的长度
*h = append(*h, x.(int))
} func (h *intHeap) Pop() interface{} {
// Pop 使用 *h ,是因为
// Pop 减短了 h 的长度
res := (*h)[len(*h)-]
*h = (*h)[:len(*h)-]
return res
}
实现了之后,我们就可以非常简单和快捷的操作堆了
type KthLargest struct {
k int
heap intHeap
}
// Constructor 创建 KthLargest
func Constructor(k int, nums []int) KthLargest {
h := intHeap(nums)
heap.Init(&h)
for len(h) > k {
heap.Pop(&h)
}
return KthLargest{
k: k,
heap: h,
}
}
// Add 负责添加元素
func (kl *KthLargest) Add(val int) int {
heap.Push(&kl.heap, val)
if len(kl.heap) > kl.k {
heap.Pop(&kl.heap)
}
return kl.heap[]
}
数据流中的第k大元素的golang实现的更多相关文章
- Leetcode 703. 数据流中的第K大元素
1.题目要求 设计一个找到数据流中第K大元素的类(class).注意是排序后的第K大元素,不是第K个不同的元素. 你的 KthLargest 类需要一个同时接收整数 k 和整数数组nums 的构造器, ...
- Java实现 LeetCode 703 数据流中的第K大元素(先序队列)
703. 数据流中的第K大元素 设计一个找到数据流中第K大元素的类(class).注意是排序后的第K大元素,不是第K个不同的元素. 你的 KthLargest 类需要一个同时接收整数 k 和整数数组n ...
- java优先级队列的使用 leecode.703.数据流中的第K大元素
//设计一个找到数据流中第K大元素的类(class). //注意是排序后的第K大元素,不是第K个不同的元素. class KthLargest { private PriorityQueue<I ...
- [Swift]LeetCode703. 数据流中的第K大元素 | Kth Largest Element in a Stream
Design a class to find the kth largest element in a stream. Note that it is the kth largest element ...
- [LeetCode解题报告] 703. 数据流中的第K大元素
题目描述 设计一个找到数据流中第K大元素的类(class).注意是排序后的第K大元素,不是第K个不同的元素. 你的 KthLargest 类需要一个同时接收整数 k 和整数数组nums 的构造器,它包 ...
- 703. 数据流中的第 K 大元素
设计一个找到数据流中第 K 大元素的类(class).注意是排序后的第 K 大元素,不是第 K 个不同的元素. 你的 KthLargest 类需要一个同时接收整数 k 和整数数组 nums 的构造器, ...
- Leetcode703.Kth Largest Element in a Stream数据流中的第K大元素
设计一个找到数据流中第K大元素的类(class).注意是排序后的第K大元素,不是第K个不同的元素. 你的 KthLargest 类需要一个同时接收整数 k 和整数数组nums 的构造器,它包含数据流中 ...
- 【Leetcode堆】数据流中的第K大元素(703)
题目 设计一个找到数据流中第K大元素的类(class).注意是排序后的第K大元素,不是第K个不同的元素. 你的 KthLargest 类需要一个同时接收整数 k 和整数数组nums 的构造器,它包含数 ...
- Leetcode 703题数据流中的第K大元素(Kth Largest Element in a Stream)Java语言求解
题目链接 https://leetcode-cn.com/problems/kth-largest-element-in-a-stream/ 题目内容 设计一个找到数据流中第K大元素的类(class) ...
随机推荐
- AttributeError: module 'pip' has no attribute 'main'
Pycharm在运行pip安装模块是报错如下: 解决方法: 找到安装路径下的packaging_tool.py文件修改如下: 我的路径为D:\Program Files\JetBrains\PyCha ...
- Zara带你快速入门WPF(4)---Command与功能区控件
前言:许多数据驱动的应用程序都包含菜单和工具栏或功能区控件,允许用户控制操作,在WPF中,也可以使用功能区控件,所以这里介绍菜单和功能区控件. 一.菜单控件 在WPF中,菜单很容易使用Menu和Men ...
- 深入并发包 ConcurrentHashMap 源码解析
以前写过介绍HashMap的文章,文中提到过HashMap在put的时候,插入的元素超过了容量(由负载因子决定)的范围就会触发扩容操作,就是rehash,这个会重新将原数组的内容重新hash到新的扩容 ...
- (五)通过Python的select监控多个描述符实现并发连接
概述 本文通过使用select改写之前的服务器程序通过监控多个套接字描述符来实现并发连接并加入了一些机制让程序更加健壮,不过我们所有的实验都是建立在单词发送数据不会超过1024字节,如果超过你需要做特 ...
- QQ音乐的动效歌词是如何实践的?
本文由云+社区发表 作者:QQ音乐技术团队 一. 背景 1. 现状 歌词浏览已经成为音乐app的标配,展示和动画效果也基本上大同小异,主要是单行的逐字染色的卡拉OK效果和多行的滚动效果.当然,我们也不 ...
- ASP.NET MVC ETag & Cache等优化方法
背景 最近有一个项目是用SmartAdmin + Jquery + EasyUI 一个ASP.NET MVC5的项目,一直存在一个性能问题,加载速度比较慢,第一次加载需要(在没有cache的情况下)需 ...
- #12 Python函数
前言 矩形的面积 S = ab,只要知道任一矩形的的长和宽,就可以带入上式求得面积.这样有什么好处呢?一个公式,适用于全部矩形,一个公式,重复利用,减少了大脑的记忆负担.像这类用变量代替不变量的思想在 ...
- xshell连接虚拟机详解--技术流ken
xshell连接虚拟机 第一步:网络模式更改为桥接模式 第二步:重启网络 [root@ken1 ~]# systemctl restart network 第三步:获取IP地址 输入命令ip a 第四 ...
- 第9章 使用客户端凭据保护API - Identity Server 4 中文文档(v1.0.0)
快速入门介绍了使用IdentityServer保护API的最基本方案. 我们将定义一个API和一个想要访问它的客户端. 客户端将通过提供ClientCredentials在IdentityServer ...
- 记录一下这次web实训的两个网站
先是做的一个天猫的部分首页,接着过了一周左右开始做京东的一个商品详情页. 从天猫到京东,从不敢做到开始不断突破自己,从代码量的堆积中汲取经验.收获真的很大,也学习到了很多,还有很多要学的,继续加油吧~ ...