| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 | type none struct{}type pair struct {	key int	set map[string]none}type AllOne struct {	m  map[string]*list.Element	li *list.List}/** Initialize your data structure here. */func Constructor() AllOne {	return AllOne{		m:  make(map[string]*list.Element),		li: list.New(),	}}/** Inserts a new key <Key> with value 1. Or increments an existing key by 1. */func (this *AllOne) Inc(key string) {	if val, ok := this.m[key]; ok { // Increments		next := val.Next()		if next == nil || val.Value.(pair).key+1 < next.Value.(pair).key { // Insert after			next = this.li.InsertAfter(pair{val.Value.(pair).key + 1, map[string]none{key: none{}}}, val)		} else { // Increment after			next.Value.(pair).set[key] = none{}		}		this.m[key] = next		if len(val.Value.(pair).set) == 1 { // Remove current element			this.li.Remove(val)		} else { // Remove from set			delete(val.Value.(pair).set, key)		}	} else { // Inserts		if this.li.Len() == 0 || 1 < this.li.Front().Value.(pair).key { // Push front			this.li.PushFront(pair{1, map[string]none{key: none{}}})		} else { // Move to ones set			this.li.Front().Value.(pair).set[key] = none{}		}		this.m[key] = this.li.Front()	}}/** 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 val, ok := this.m[key]; ok {		if val.Value.(pair).key == 1 { // Removes			if len(val.Value.(pair).set) == 1 { // Remove whole element				this.li.Remove(val)			} else { // Remove from set				delete(val.Value.(pair).set, key)			}			delete(this.m, key) // Remove from map		} else { // Decrements			prev := val.Prev()			if prev == nil || prev.Value.(pair).key < val.Value.(pair).key-1 { // Insert before				prev = this.li.InsertBefore(pair{val.Value.(pair).key - 1, map[string]none{key: none{}}}, val)			} else { // Move to prev set				prev.Value.(pair).set[key] = none{}			}			this.m[key] = prev			if len(val.Value.(pair).set) == 1 { // Remove current element				this.li.Remove(val)			} else {				delete(val.Value.(pair).set, key) // Remove from set			}		}	}}/** Returns one of the keys with maximal value. */func (this *AllOne) GetMaxKey() string {	if this.li.Len() != 0 {		set := this.li.Back().Value.(pair).set		for k := range set {			return k		}	}	return ""}/** Returns one of the keys with Minimal value. */func (this *AllOne) GetMinKey() string {	if this.li.Len() != 0 {		set := this.li.Front().Value.(pair).set		for k := range set {			return k		}	}	return ""}/** * 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(); */
 |