设计一个找到数据流中第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实现相关推荐

  1. 从C语言的角度重构数据结构系列(七)-数据结构堆知识求解数据流中的第K大元素

    前言 在这里给自己打个广告,需要的小伙伴请自行订阅. python快速学习实战应用系列课程 https://blog.csdn.net/wenyusuran/category_2239261.html ...

  2. ⭐算法入门⭐《堆》中等02 —— LeetCode 703. 数据流中的第 K 大元素

    文章目录 一.题目 1.题目描述 2.基础框架 3.原题链接 二.解题报告 1.思路分析 2.时间复杂度 3.代码详解 三.本题小知识 四.加群须知 一.题目 1.题目描述   设计一个找到数据流中第 ...

  3. 703. 数据流中的第 K 大元素

    703. 数据流中的第 K 大元素: 题目链接 :[703. 数据流中的第 K 大元素]https://leetcode-cn.com/problems/kth-largest-element-in- ...

  4. Java实现 LeetCode 703 数据流中的第K大元素(先序队列)

    703. 数据流中的第K大元素 设计一个找到数据流中第K大元素的类(class).注意是排序后的第K大元素,不是第K个不同的元素. 你的 KthLargest 类需要一个同时接收整数 k 和整数数组n ...

  5. leetcode 703. 数据流中的第K大元素 最小堆解法 c语言

    如题: 设计一个找到数据流中第K大元素的类(class).注意是排序后的第K大元素,不是第K个不同的元素. 你的 KthLargest 类需要一个同时接收整数 k 和整数数组nums 的构造器,它包含 ...

  6. leetcode 703. 数据流中的第 K 大元素(堆)

    设计一个找到数据流中第 k 大元素的类(class).注意是排序后的第 k 大元素,不是第 k 个不同的元素. 请实现 KthLargest 类: KthLargest(int k, int[] nu ...

  7. LeetCode 703. 数据流中的第K大元素(优先队列)

    1. 题目 设计一个找到数据流中第K大元素的类(class). 注意是排序后的第K大元素,不是第K个不同的元素. 你的 KthLargest 类需要一个同时接收整数 k 和整数数组nums 的构造器, ...

  8. 求数据流中的第K大元素

    题目 设计一个找到数据流中第K大元素的类(class).注意是排序后的第K大元素,不是第K个不同的元素. 你的 KthLargest 类需要一个同时接收整数 k 和整数数组nums 的构造器,它包含数 ...

  9. 174. 地下城游戏;剑指 Offer 40. 最小的k个数;378. 有序矩阵中第K小的元素;703. 数据流中的第K大元素

    一些恶魔抓住了公主(P)并将她关在了地下城的右下角.地下城是由 M x N 个房间组成的二维网格.我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主. 骑士的初始 ...

最新文章

  1. Angular开山篇
  2. FreeBSD NTP 简单使用
  3. unknown type name 'uint32_t'
  4. bert中文预训练模型_HFL中文预训练系列模型已接入Transformers平台
  5. [js] promise的构造函数是同步执行还是异步执行,它的then方法呢?
  6. C语言:四则计算器(支持小数,括号和次方幂 组合输入计算)
  7. HT for Web的HTML5树组件延迟加载技术实现
  8. 如何解决ArrayAdapter requires the resource ID to be a TextView
  9. hypertrm超级终端_win7电脑怎么添加windows超级终端
  10. 租客如何玩转物联网,打造智能新生活
  11. linux vnc离线安装包,Linux之部署vnc应用
  12. 同步现象 心理学_男生是不是更容易从失恋中走出来?心理学:失恋后悲伤,男女不同...
  13. STM32F103/429串口IAP+Ymodem升级
  14. (转)STM32学习笔记(3):系统时钟和SysTick定时器
  15. OpenCV3.4.1+VS2018 安装并配置详细教程
  16. python误差修正模型_如何用格兰杰检验、协整对数据进行分析_格兰杰因果检验...
  17. 尺规作图将任意角度三等分
  18. python求方差函数_python求均方差
  19. excel表格打印每页都有表头_excel技巧:excel表格打印后每页自动带标题、页眉页脚...
  20. QQ2011 Beta3透明皮肤主界面修改详细教程

热门文章

  1. CSS3学习笔记-字体和文字
  2. Linux系统文件和目录管理
  3. 算法1-排序LowB三人组
  4. File IO(NIO.2):路径类 和 路径操作
  5. 初学者如何学习Vim
  6. javax.servlet.GenericServlet类(协议无关版本)
  7. 我的世界java版gamemode指令_我的世界切换生存和创造模式的命令是什么?
  8. 计算机网络-TCP拥塞控制
  9. C语言经典例85-判断一个素数能被几个9整除
  10. C语言经典例66-输入3个数a,b,c,按大小顺序输出