Marginalman 板


LINE

没多难 还是写很久 上班後真的变笨了 3013. Divide an Array Into Subarrays With Minimum Cost II 按照题目, 第一个subarray的cost永远是 nums[0] 所以要考虑的只有後面k-1个subarray的cost 那就用sliding window 一开始的范围就是1 ~ 1 + dist 找出window内最小的k-1个数 这边可以用maxHeap来记录这k-1个数 并且用minHeap纪录范围内不在maxHeap的数 就这样维护maxHeap就可以找到答案了 golang code : type node struct { val int idx int // 记录在 heap 阵列中的索引 whichHeap int // 0 为 MinHeap, 1 为 MaxHeap (自定义标记) } type GeneralHeap struct { nodes []*node isMax bool // true 为 MaxHeap, false 为 MinHeap } func (h GeneralHeap) Len() int { return len(h.nodes) } func (h GeneralHeap) Swap(i, j int) { h.nodes[i], h.nodes[j] = h.nodes[j], h.nodes[i] // 关键:交换时同步更新 node 内部的 idx h.nodes[i].idx = i h.nodes[j].idx = j } func (h GeneralHeap) Less(i, j int) bool { if h.isMax { return h.nodes[i].val > h.nodes[j].val } return h.nodes[i].val < h.nodes[j].val } func (h *GeneralHeap) Push(x interface{}) { n := x.(*node) n.idx = len(h.nodes) h.nodes = append(h.nodes, n) } func (h *GeneralHeap) Pop() interface{} { n := h.Len() res := (*h).nodes[n-1] res.idx = -1 // 代表已不在 heap 中 h.nodes = h.nodes[:n-1] return res } func minimumCost(nums []int, k int, dist int) int64 { n := len(nums) maxH := GeneralHeap{make([]*node, 0), true} minH := GeneralHeap{make([]*node, 0), false} ans, curSum := math.MaxInt64, 0 nodeRec := make([]*node, n) targetSize := k - 1 for i := 0; i < n; i++ { nodeRec[i] = &node{nums[i], -1, -1} } add := func(nd *node) { heap.Push(&maxH, nd) nd.whichHeap = 1 curSum += nd.val if maxH.Len() > targetSize { top := heap.Pop(&maxH).(*node) top.whichHeap = 0 curSum -= top.val heap.Push(&minH, top) } } remove := func(nd *node) { if nd.whichHeap == 0 { heap.Remove(&minH, nd.idx) } else if nd.whichHeap == 1 { curSum -= nd.val heap.Remove(&maxH, nd.idx) if minH.Len() > 0 { top := heap.Pop(&minH).(*node) top.whichHeap = 1 curSum += top.val heap.Push(&maxH, top) } } nd.whichHeap = -1 } for i := 1; i <= 1+dist && i < n; i++ { add(nodeRec[i]) } ans = curSum for i := 1; i < n; i++ { remove(nodeRec[i]) right := 1 + dist + i if right < n { add(nodeRec[right]) } if maxH.Len() == targetSize { ans = min(ans, curSum) } } return int64(ans + nums[0]) } --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 203.121.235.241 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Marginalman/M.1770042256.A.907.html
1F:→ oin1104: 为什麽你那麽强 02/02 22:40







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:BabyMother站内搜寻

TOP