python leetcode 432. All O`one Data Structure
阿新 • • 發佈:2018-12-01
所以操作要O(1) 要用字典 這裡有幾點難點 68ms 86%
1.要取最大和最小值 所以不僅要有key->val 字典 還要有val->key字典
2.一個val可能對應於多個key 而且還是要O(1)操作 所以val->key字典要存int:dict型別 還是可以存Int:set
3.最大值很好判定 插入的時候做個max對比 刪除的時候判斷當前最大值是否還在val->key字典中 如果還在則最大值不變 如果不在最大值減一
最小值判定 插入操作中 如果key的值為1 那麼最小值必為1 如果不為1並且當前最小值等於未進行插入前的key的值 進行判斷 如果nowV不在 val->key字典中 那麼最小值+=1
刪除操作中與插入操作判定類似 但有個難點即把唯一的值為1的key給刪了 如何得到當前的最小值 採用迴圈遍歷val->key字典得到最小值
class AllOne: def __init__(self): """ Initialize your data structure here. """ self.key_val={} self.val_key={} self.maxV=1 self.minV=1 def inc(self, key): """ Inserts a new key <Key> with value 1. Or increments an existing key by 1. :type key: str :rtype: void """ if key in self.key_val: nowV=self.key_val[key] if len(self.val_key[nowV])==1: del self.val_key[nowV] else: del self.val_key[nowV][key] self.key_val[key] +=1 if nowV+1 in self.val_key: self.val_key[nowV+1][key]=nowV+1 else: self.val_key[nowV+1]={key:nowV+1} self.maxV=max(self.maxV,self.key_val[key]) if self.minV==nowV: if not nowV in self.val_key: self.minV+=1 else: self.key_val[key] =1 if 1 in self.val_key: self.val_key[1][key]=1 else: self.val_key[1]={key:1} self.minV=1 def dec(self, key): """ Decrements an existing key by 1. If Key's value is 1, remove it from the data structure. :type key: str :rtype: void """ if key in self.key_val: if self.key_val[key] ==1: del self.key_val[key] if len(self.val_key[1])==1: del self.val_key[1] self.minV=self.maxV for key in self.val_key.keys(): self.minV=min(self.minV,key) else: del self.val_key[1][key] else: nowV=self.key_val[key] if len(self.val_key[nowV])==1: del self.val_key[nowV] else: del self.val_key[nowV][key] self.key_val[key]-=1 if nowV-1 in self.val_key: self.val_key[nowV-1][key]=nowV-1 else: self.val_key[nowV-1]={key:nowV-1} if not self.maxV in self.val_key: self.maxV-=1 if self.minV==nowV: self.minV-=1 def getMaxKey(self): """ Returns one of the keys with maximal value. :rtype: str """ if len(self.key_val)==0: return '' item=self.val_key[self.maxV].popitem() if len(self.val_key[self.maxV])==0: self.val_key[self.maxV]={item[0]:item[1]} else: self.val_key[self.maxV][item[0]]=item[1] return item[0] def getMinKey(self): """ Returns one of the keys with Minimal value. :rtype: str """ if len(self.key_val)==0: return '' item=self.val_key[self.minV].popitem() if len(self.val_key[self.minV])==0: self.val_key[self.minV]={item[0]:item[1]} else: self.val_key[self.minV][item[0]]=item[1] return item[0]