golang刷leetcode技巧之如何实现全 O(1) 的数据结构
发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章主要介绍了golang刷leetcode技巧之如何实现全 O(1) 的数据结构,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。请
千家信息网最后更新 2026年11月03日golang刷leetcode技巧之如何实现全 O(1) 的数据结构
这篇文章主要介绍了golang刷leetcode技巧之如何实现全 O(1) 的数据结构,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
请你实现一个数据结构支持以下操作:
Inc(key) - 插入一个新的值为 1 的 key。或者使一个存在的 key 增加一,保证 key 不为空字符串。
Dec(key) - 如果这个 key 的值是 1,那么把他从数据结构中移除掉。否则使一个存在的 key 值减一。如果这个 key 不存在,这个函数不做任何事情。key 保证不为空字符串。
GetMaxKey() - 返回 key 中值最大的任意一个。如果没有元素存在,返回一个空字符串"" 。
GetMinKey() - 返回 key 中值最小的任意一个。如果没有元素存在,返回一个空字符串""。
挑战:
你能够以 O(1) 的时间复杂度实现所有操作吗?
解题思路
1,这是lru的变体,用hash+有序双链表的形式
2,每次inc和dec的时候将当前节点从链表中去除
3,然后找到合适的位置插入
4,注意,当inc后,后面的连续常数个值相等,需要特殊处理
5,dec类似
代码实现
type Node struct{next *Nodeprev *Nodeval intkey string}type AllOne struct {head *Nodetail *Nodem map[string]*Node}/** Initialize your data structure here. */func Constructor() AllOne {ao:=AllOne{head:&Node{},tail:&Node{},m:make(map[string]*Node),}ao.head.next=ao.tailao.tail.prev=ao.headreturn ao}/** Inserts a new keywith value 1. Or increments an existing key by 1. */ func (this *AllOne) Inc(key string) {if n,ok:=this.m[key];ok{this.m[key].val++next:=n.nextif next==this.tail || next.val>=n.val{return}else{next.prev=n.prevn.prev.next=nextfor next.next!=this.tail && next.next.valnext=next.next}n.next=next.nextn.prev=nextnext.next.prev=nnext.next=n}}else{n:=&Node{val:1,key:key,prev:this.head,next:this.head.next,}this.head.next.prev=nthis.head.next=nthis.m[key]=n}this.Print()}func(this*AllOne)Print(){for n:=this.head.next ;n!=this.tail;n=n.next{println(n.val)}}/** Decrements an existing key by 1. If Key's value is 1, remove it from the data structure. */func (this *AllOne) Dec(key string) {if _,ok:=this.m[key];!ok {return}n:= this.m[key]if this.m[key].val>1{n.val--if n.prev==this.head || n.prev.val<=n.val{return}else {prev:=n.prevprev.next=n.nextn.next.prev=prevfor prev.prev!=this.head && prev.prev.val>n.val{prev=prev.prev}n.prev=prev.prevn.next=prevprev.prev.next=nprev.prev=n}}else{n.prev.next=n.nextn.next.prev=n.prevdelete(this.m,key)}this.Print()}/** Returns one of the keys with maximal value. */func (this *AllOne) GetMaxKey() string {if this.head.next==this.tail{return ""}return this.tail.prev.key}/** Returns one of the keys with Minimal value. */func (this *AllOne) GetMinKey() string {if this.head.next==this.tail{return ""}return this.head.next.key}/*** Your AllOne object will be instantiated and called as such:* obj := Constructor();* obj.Inc(key);* obj.Dec(key);* param_3 := obj.GetMaxKey();* param_4 := obj.GetMinKey();*/
感谢你能够认真阅读完这篇文章,希望小编分享的"golang刷leetcode技巧之如何实现全 O(1) 的数据结构"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!
数据
数据结构
结构
空字符
篇文章
技巧
中值
元素
保证
支持
合适
复杂
最大
最小
有序
特殊
代码
价值
位置
兴趣
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
深圳市人人互联网科技有限公司
互联网科技工作委员会毛军
互联网科技资迅
易互联网科技有限公司
互联网与未来科技
未来的互联网科技
天扬科技互联网广告
深圳前海聚择互联网科技有限公司
剑昆互联网络科技有限公司临桂
互联网科技寓意
现代互联网科技股
互联网科技有哪些公司
昊天互联网科技有限公司
青海科技产业互联网发展
银行科技岗属于互联网吗
浙南科技城互联网大厦招聘
互联网与数字科技关系
下一代互联网重大应用科技园
互联网科技平台产品运营
深圳互联网科技园地址
互联网科技工作委员会
互联网科技博客
语蝶互联网科技有限公司
宜昌元轩互联网科技有限公司
互联网媒体平台算高科技产业
四川慕妮娅互联网科技有限公司
区块链结合互联网科技
元气玛特互联网科技公司是外包吗
抖集互联网科技技术咨询
科技互联网专业务虚会材料