golang刷leetcode技巧之如何实现全 O(1) 的数据结构
发表于:2025-01-31 作者:千家信息网编辑
千家信息网最后更新 2025年01月31日,这篇文章主要介绍了golang刷leetcode技巧之如何实现全 O(1) 的数据结构,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。请
千家信息网最后更新 2025年01月31日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 *Node
prev *Node
val int
key string
}
type AllOne struct {
head *Node
tail *Node
m 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.tail
ao.tail.prev=ao.head
return ao
}
/** Inserts a new key
with 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.next
if next==this.tail || next.val>=n.val{
return
}else{
next.prev=n.prev
n.prev.next=next
for next.next!=this.tail && next.next.val
next=next.next
}
n.next=next.next
n.prev=next
next.next.prev=n
next.next=n
}
}else{
n:=&Node{
val:1,
key:key,
prev:this.head,
next:this.head.next,
}
this.head.next.prev=n
this.head.next=n
this.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.prev
prev.next=n.next
n.next.prev=prev
for prev.prev!=this.head && prev.prev.val>n.val{
prev=prev.prev
}
n.prev=prev.prev
n.next=prev
prev.prev.next=n
prev.prev=n
}
}else{
n.prev.next=n.next
n.next.prev=n.prev
delete(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安全错误
数据库的锁怎样保障安全
数据库周边应用
服务器与手机客户端
我的世界中国服务器怎么安装光影
工资管理系统数据库设计
云南昭通国家网络安全宣传周
昆明教育电视台网络安全视频
订餐数据库设计
蝌蚪语音服务器
对网络安全工作的了解和认识
网络安全维护什么意思
九台区智能网络技术售后服务
沈阳华越网络技术
思天网络技术
怎么判断是网络慢还是服务器慢
为什么做软件开发很辛苦
原来抓取哪里的数据库
网络技术在阅读教学中的运用
汽车网络安全推荐书籍
软件开发政府采购程序
阿尔比恩连接不了服务器
金桥信息属于网络安全吗
网络安全教育试卷b及答案
把之前的数据库还原
历史学统计数据库
浙江ai服务器
服务器机柜技术参数
游族网络技术总监月薪
sdn网络技术的优点
数据库的设计技术
黔西南州网络安全宣传周启动