数据流中的第k大元素的golang实现
设计一个找到数据流中第K大元素的类(class)。注意是排序后的第K大元素,不是第K个不同的元素。
你的 KthLargest 类需要一个同时接收整数 k 和整数数组nums 的构造器,它包含数据流中的初始元素。每次调用 KthLargest.add,返回当前数据流中第K大的元素。
int k = 3; int[] arr = [4,5,8,2]; KthLargest kthLargest = new KthLargest(3, arr); kthLargest.add(3); // returns 4 kthLargest.add(5); // returns 5 kthLargest.add(10); // returns 5 kthLargest.add(9); // returns 8 kthLargest.add(4); // returns 8
这道题我们可以想到使用优先队列来做,优先队列的长度为K,按照从小到大排序,那么取出第K大的就是取出下标为0的值
首先我们构造一个小顶堆的数据结构
type KthLargest struct {PriorityQueue []int //优先队列Size int //小顶堆的容量 }
func Constructor(k int, nums []int) KthLargest {var ks KthLargestks.Size = kfor index := 0; 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[0] <= val {this.PriorityQueue = this.PriorityQueue[1:]this.PriorityQueue = append(this.PriorityQueue, val)}sort.Ints(this.PriorityQueue)return this.PriorityQueue[0] }
这里是一个耗时的做法,因为这里每次添加元素的时候,我们都会去排序,把堆内元素最小的放在最前
而我们可以通过实现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)-1]*h = (*h)[:len(*h)-1]return res }
实现了之后,我们就可以非常简单和快捷的操作堆了
type KthLargest struct {k intheap 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[0] }
转载于:https://www.cnblogs.com/TimLiuDream/p/10108454.html
数据流中的第k大元素的golang实现相关推荐
- 从C语言的角度重构数据结构系列(七)-数据结构堆知识求解数据流中的第K大元素
前言 在这里给自己打个广告,需要的小伙伴请自行订阅. python快速学习实战应用系列课程 https://blog.csdn.net/wenyusuran/category_2239261.html ...
- ⭐算法入门⭐《堆》中等02 —— LeetCode 703. 数据流中的第 K 大元素
文章目录 一.题目 1.题目描述 2.基础框架 3.原题链接 二.解题报告 1.思路分析 2.时间复杂度 3.代码详解 三.本题小知识 四.加群须知 一.题目 1.题目描述 设计一个找到数据流中第 ...
- 703. 数据流中的第 K 大元素
703. 数据流中的第 K 大元素: 题目链接 :[703. 数据流中的第 K 大元素]https://leetcode-cn.com/problems/kth-largest-element-in- ...
- Java实现 LeetCode 703 数据流中的第K大元素(先序队列)
703. 数据流中的第K大元素 设计一个找到数据流中第K大元素的类(class).注意是排序后的第K大元素,不是第K个不同的元素. 你的 KthLargest 类需要一个同时接收整数 k 和整数数组n ...
- leetcode 703. 数据流中的第K大元素 最小堆解法 c语言
如题: 设计一个找到数据流中第K大元素的类(class).注意是排序后的第K大元素,不是第K个不同的元素. 你的 KthLargest 类需要一个同时接收整数 k 和整数数组nums 的构造器,它包含 ...
- leetcode 703. 数据流中的第 K 大元素(堆)
设计一个找到数据流中第 k 大元素的类(class).注意是排序后的第 k 大元素,不是第 k 个不同的元素. 请实现 KthLargest 类: KthLargest(int k, int[] nu ...
- LeetCode 703. 数据流中的第K大元素(优先队列)
1. 题目 设计一个找到数据流中第K大元素的类(class). 注意是排序后的第K大元素,不是第K个不同的元素. 你的 KthLargest 类需要一个同时接收整数 k 和整数数组nums 的构造器, ...
- 求数据流中的第K大元素
题目 设计一个找到数据流中第K大元素的类(class).注意是排序后的第K大元素,不是第K个不同的元素. 你的 KthLargest 类需要一个同时接收整数 k 和整数数组nums 的构造器,它包含数 ...
- 174. 地下城游戏;剑指 Offer 40. 最小的k个数;378. 有序矩阵中第K小的元素;703. 数据流中的第K大元素
一些恶魔抓住了公主(P)并将她关在了地下城的右下角.地下城是由 M x N 个房间组成的二维网格.我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主. 骑士的初始 ...
最新文章
- Angular开山篇
- FreeBSD NTP 简单使用
- unknown type name 'uint32_t'
- bert中文预训练模型_HFL中文预训练系列模型已接入Transformers平台
- [js] promise的构造函数是同步执行还是异步执行,它的then方法呢?
- C语言:四则计算器(支持小数,括号和次方幂 组合输入计算)
- HT for Web的HTML5树组件延迟加载技术实现
- 如何解决ArrayAdapter requires the resource ID to be a TextView
- hypertrm超级终端_win7电脑怎么添加windows超级终端
- 租客如何玩转物联网,打造智能新生活
- linux vnc离线安装包,Linux之部署vnc应用
- 同步现象 心理学_男生是不是更容易从失恋中走出来?心理学:失恋后悲伤,男女不同...
- STM32F103/429串口IAP+Ymodem升级
- (转)STM32学习笔记(3):系统时钟和SysTick定时器
- OpenCV3.4.1+VS2018 安装并配置详细教程
- python误差修正模型_如何用格兰杰检验、协整对数据进行分析_格兰杰因果检验...
- 尺规作图将任意角度三等分
- python求方差函数_python求均方差
- excel表格打印每页都有表头_excel技巧:excel表格打印后每页自动带标题、页眉页脚...
- QQ2011 Beta3透明皮肤主界面修改详细教程