1. 程式人生 > >python leetcode 432. All O`one Data Structure

python leetcode 432. All O`one Data Structure

所以操作要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]