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

embedded/2024/10/22 2:09:44/

题目:

题解

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/embedded/129435.html

相关文章

python 爬虫 入门 四、线程,进程,协程

线程和进程大部分人估计都知道&#xff0c;但协程就不一定了。 一、进程 进程是操作系统分配资源和调度的基本单位&#xff0c;一个程序开始运行时&#xff0c;操作系统会给他分配一块独立的内存空间并分配一个PCB作为唯一标识。初始化内存空间后进程进入就绪态&#xff0c;PC…

MySQL 设计数据表

一个数据表主要包含信息有 : 表名、主键、字段、数据类型、索引&#xff0c;本节主要介绍表的命名规范、字段命名、字段的数据类型选择。 新建的表都是新建在 “item_name” 数据库中的&#xff0c;新建 “item_name” 数据库命令如下 : CREATE DATABASE item_name;新建数据库…

信号与噪声分析——第一节-确定信号的分析

目录 1.确定信号的分析 1.1确定信号的分类&#xff1a; 1.周期信号与非周期信号&#xff1a; 周期信号的定义&#xff1a; 性质&#xff1a; 2.能量信号与功率信号&#xff1a; 定义 区别&#xff1a; 3.基带信号与频带信号&#xff1a; 基带信号的定义&#xff1a; …

shell错误修改

错误处理 检查ffmpeg和ffprobe命令是否已安装 if ! command -v ffmpeg &> /dev/null || ! command -v ffprobe &> /dev/null thenecho "ffmpeg或ffprobe未安装&#xff0c;请先安装它们。"exit ficommand -v xxxx command 是一个内置命令&#xff0c;…

工业物联网关-TCP透传

TCP透传功能提供类似于DTU(Data Transmit Unit)的功能&#xff0c;用户在网络端使用TCP协议连接网关&#xff0c;与串口通道绑定&#xff0c;建立起TCP与串口的通道&#xff0c;网关相当于一个中转点。 菜单选择"数据上行-tcp透传"&#xff0c;查看当前透传通道列表&…

【WPF】中Binding的应用

在 WPF (Windows Presentation Foundation) 中&#xff0c;数据绑定是一种强大的机制&#xff0c;它允许你将用户界面&#xff08;UI&#xff09;元素的属性与各种数据源关联起来。这种关联可以是单向的、双向的或一次性的。WPF 的数据绑定支持多种数据源&#xff0c;包括普通对…

Android 10.0 Camera2 拍照镜像功能实现

1.前言 在10.0的系统rom定制化开发中,在进行camera2的相关拍照功能开发中,在某些时候会遇到拍照照片 左右镜像的问题,就是照片左半边和右半边是反的,所以就需要在拍照的时候保存图片的时候实现 左右镜像功能,接下来就来分析下拍照保存图片的流程 2.Camera2 拍照镜像功能实…

【日志】力扣刷题 -- 轮转数组

2024.10.06 【力扣刷题】 经典面试150—转轮数组—中等 189. 轮转数组 - 力扣&#xff08;LeetCode&#xff09; 第一次做&#xff0c;暴力循环 // 超出时间限制 void rotate(int* nums, int numsSize, int k) {for(int i 0; i < k; i){int right numsSize - 1;int temp…