数据流中的第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) ...
随机推荐
- 强如 Disruptor 也发生内存溢出?
前言 OutOfMemoryError 问题相信很多朋友都遇到过,相对于常见的业务异常(数组越界.空指针等)来说这类问题是很难定位和解决的. 本文以最近碰到的一次线上内存溢出的定位.解决问题的方式展开 ...
- Jquery制作小星星(常用于评价)
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- PHP分页倒序时,需要注意的问题
PHP分页倒序请求,如果有新数据加入,下一页会出现重复数据 解决方案: 第一次查询时,给前端返回一个查询时间戳,下一次请求时,把时间戳带过来,只查询比这个时间戳小的数据
- 华为oj之求int型正整数在内存中存储时1的个数
题目: 求int型正整数在内存中存储时1的个数 热度指数:4427 时间限制:1秒 空间限制:32768K 题目描述 输入一个int型的正整数,计算出该int型数据在内存中存储时1的个数. 输入描述: ...
- Android Native crash日志分析
在Android应用crash的类型中,native类型crash应该是比较难的一种了,因为大家接触的少,然后相对也要多转几道工序,所有大部分对这个都比较生疏.虽然相关文章也有很多了,但是我在刚开始学 ...
- 爬虫入门(四)——Scrapy框架入门:使用Scrapy框架爬取全书网小说数据
为了入门scrapy框架,昨天写了一个爬取静态小说网站的小程序 下面我们尝试爬取全书网中网游动漫类小说的书籍信息. 一.准备阶段 明确一下爬虫页面分析的思路: 对于书籍列表页:我们需要知道打开单本书籍 ...
- JDK源码分析(1)之 String 相关
在此之前有无数次下定决心要把JDK的源码大致看一遍,但是每次还没点开就已被一个超链接或者其他事情吸引直接跳开了.直到最近突然意识到,因为对源码的了解不深导致踩了许多莫名其妙的坑,所以再次下定决心要把 ...
- Linux平台运行jmeter
这篇博客介绍 jmeter 在 Linux 环境进行压测,大致流程是 在 window上编辑好测试脚本,然后拷贝到 Linux上运行,再把 Linux上的运行结果拿到 windows 的 jmeter ...
- C# Task 篇幅一
在https://www.cnblogs.com/loverwangshan/p/10415937.html中我们有讲到委托的异步方法,Thread,ThreadPool,然后今天来讲一下Task, ...
- 使用NOPI写入Excel基础代码
using NPOI.XSSF.UserModel; using System; using System.Collections.Generic; using System.IO; using Sy ...