Golang | Leetcode Golang题解之第480题滑动窗口中位数

news/2024/10/20 3:29:22/

题目:

题解

type hp struct {sort.IntSlicesize int
}
func (h *hp) Push(v interface{}) { h.IntSlice = append(h.IntSlice, v.(int)) }
func (h *hp) Pop() interface{}   { a := h.IntSlice; v := a[len(a)-1]; h.IntSlice = a[:len(a)-1]; return v }
func (h *hp) push(v int)         { h.size++; heap.Push(h, v) }
func (h *hp) pop() int           { h.size--; return heap.Pop(h).(int) }
func (h *hp) prune() {for h.Len() > 0 {num := h.IntSlice[0]if h == small {num = -num}if d, has := delayed[num]; has {if d > 1 {delayed[num]--} else {delete(delayed, num)}heap.Pop(h)} else {break}}
}var delayed map[int]int
var small, large *hpfunc medianSlidingWindow(nums []int, k int) []float64 {delayed = map[int]int{} // 哈希表,记录「延迟删除」的元素,key 为元素,value 为需要删除的次数small = &hp{}           // 大根堆,维护较小的一半元素large = &hp{}           // 小根堆,维护较大的一半元素makeBalance := func() {// 调整 small 和 large 中的元素个数,使得二者的元素个数满足要求if small.size > large.size+1 { // small 比 large 元素多 2 个large.push(-small.pop())small.prune() // small 堆顶元素被移除,需要进行 prune} else if small.size < large.size { // large 比 small 元素多 1 个small.push(-large.pop())large.prune() // large 堆顶元素被移除,需要进行 prune}}insert := func(num int) {if small.Len() == 0 || num <= -small.IntSlice[0] {small.push(-num)} else {large.push(num)}makeBalance()}erase := func(num int) {delayed[num]++if num <= -small.IntSlice[0] {small.size--if num == -small.IntSlice[0] {small.prune()}} else {large.size--if num == large.IntSlice[0] {large.prune()}}makeBalance()}getMedian := func() float64 {if k&1 > 0 {return float64(-small.IntSlice[0])}return float64(-small.IntSlice[0]+large.IntSlice[0]) / 2}for _, num := range nums[:k] {insert(num)}n := len(nums)ans := make([]float64, 1, n-k+1)ans[0] = getMedian()for i := k; i < n; i++ {insert(nums[i])erase(nums[i-k])ans = append(ans, getMedian())}return ans
}

http://www.ppmy.cn/news/1540406.html

相关文章

学习的文档10/14

为什么不推荐使用外键与级联? 【强制】不得使用外键与级联&#xff0c;一切外键概念必须在应用层解决。 说明: 以学生和成绩的关系为例&#xff0c;学生表中的 student_id 是主键&#xff0c;那么成绩表中的 student_id 则为外键。如果更新学生表中的 student_id&#xff0c…

利用高德API获取整个城市的公交路线并可视化(六)

记录于2024年10月,因数据获取受网站更新策略等影响可能会失效,故记录写作时间,书接上回,根据测试地铁线路也可以如法炮制,且地铁线路更少,实现起来更容易,本篇文章我们依然以厦门地铁作为示例。 先讲一下方法思路,一共四个步骤; 方法思路 高德开放平台的JS API 1.4 …

OpenCV-物体跟踪

文章目录 一、物体跟踪的定义二、OpenCV中的物体跟踪算法三、OpenCV物体跟踪的实现步骤四、代码实现五、注意事项 OpenCV是一个开源的计算机视觉和机器学习软件库&#xff0c;它提供了丰富的功能来实现物体跟踪。以下是对OpenCV中物体跟踪的详细解释&#xff1a; 一、物体跟踪的…

[产品管理-48]:产品生命周期 - 产品线路图、技术线路图以及各自的区别

目录 一、产品线路图 1、产品路线图的内容 2、产品路线图的绘制步骤 3、产品路线图的作用与目的 4、产品路线图的应用场景 二、技术线路图 1、定义与特征 2、种类与分类 3、作用与意义 4、绘制方法 5、案例分享 三、产品线路图与技术线路图区别 1、定义与关注点 …

tPS+redis限流算法

拓展: 压力测试概念及方法(TPS/并发量)_压测tps-CSDN博客 压测指标TPS和QPS_压测tps-CSDN博客 ------------------------------------------------------------------------------ 基于Redis限流&#xff08;固定窗口、滑动窗口、漏桶、令牌桶&#xff09;&#xff08;肝货…

DAY47WEB 攻防-PHP 应用文件上传函数缺陷条件竞争二次渲染黑白名单JS 绕过

1、PHP-原生态-文件上传-检测后缀&黑白名单2、PHP-原生态-文件上传-检测信息&类型内容3、PHP-原生态-文件上传-函数缺陷&逻辑缺陷4、PHP-原生态-文件上传-版本缺陷&配置缺陷 文件上传安全指的是攻击者通过利用上传实现后门的写入连接后门进行权限控制的安全问题…

使用 Git LFS(大文件存储)

Git LFS&#xff08;Large File Storage&#xff09;是一种扩展 Git 的工具&#xff0c;旨在更有效地管理大文件的版本控制。它通过将大文件的内容存储在 Git 之外来解决 Git 在处理大文件时的性能问题。 主要特点 替代存储&#xff1a;Git LFS 不直接将大文件存储在 Git 仓库…

基于STM32的电动汽车遥控器设计

引言 本项目设计了一个基于STM32的电动汽车遥控器&#xff0c;能够通过无线通信&#xff08;如蓝牙或射频模块&#xff09;控制电动汽车的前进、后退、左右转向等动作。该遥控器采用按键或摇杆操作&#xff0c;并通过无线模块将控制指令发送给汽车控制端&#xff0c;实现远程操…