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]

猜你喜欢

转载自blog.csdn.net/Neekity/article/details/84672206