| 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();
 
-  */
 
 
  |