美文网首页
8.22 - hard - 84

8.22 - hard - 84

作者: 健时总向乱中忙 | 来源:发表于2017-08-23 02:00 被阅读0次

432. All O`one Data Structure

基本的想法就是利用一个双向链表来维持单调性,每个node的value就是当前key出现的次数,
然后利用keys这个set来维护当前这个value次数下有多少个key。这样取头或者尾就可以得到最大key或者最小key,然后在用一个hash来从key映射到key所在的node,每次增加或者减少value的时候,就移动key所在的node,并且更新映射。

class Node:
    def __init__(self, value, next, prev, key):
        self.next = next
        self.prev = prev
        self.value = value
        self.keys = {key}
        
class DoubleList:
    def __init__(self):
        self.head = Node(-1, None, None, "")
        self.tail = Node(-1, None, None, "")
        self.head.next = self.tail
        self.tail.prev = self.head
        
    def insertAfter(self, n, val, key):
        nn = Node(val, n.next, n, key)
        n.next = nn
        nn.next.prev = nn
        return nn
        
    def remove(self, n):
        n.prev.next = n.next
        n.next.prev = n.prev
        del n
        
class AllOne(object):
    
    def __init__(self):
        self.dll = DoubleList()
        self.keys = {}

    def inc(self, key):
        if key not in self.keys:
            n = self.dll.insertAfter(self.dll.head, 0, key)
            self.keys[key] = n
        else:
            n = self.keys[key]
        
        if n.value + 1 == n.next.value:
            # merge with next
            self.keys[key] = n.next
            n.keys.remove(key)
            n.next.keys.add(key)
        elif len(n.keys) == 1:
            # increment in place
            n.value += 1
        else:
            # insert new node
            nn = self.dll.insertAfter(n, n.value+1, key)
            self.keys[key] = nn
            n.keys.remove(key)
        
        #Garbage collection
        if len(n.keys) <= 0:
            self.dll.remove(n)

    def dec(self, key):
        if key not in self.keys:
            return
        else:
            n = self.keys[key]
            
        if n.value==1:
            # remove key/node
            del self.keys[key]
            n.keys.remove(key)
        elif n.value - 1 == n.prev.value:
            # merge with previous
            self.keys[key] = n.prev
            n.keys.remove(key)
            n.prev.keys.add(key)
        elif len(n.keys) == 1:
            # decrement in place
            n.value -= 1
        else:
            # insert new node
            nn = self.dll.insertAfter(n.prev, n.value-1, key)
            n.keys.remove(key)
            self.keys[key] = nn
        
        # Garbage collection
        if len(n.keys) <= 0:
            self.dll.remove(n)

    def getMaxKey(self):
        if self.dll.head.next.value == -1:
            return ""
        for k in self.dll.tail.prev.keys:
            break
        return k

    def getMinKey(self):
        if self.dll.head.next.value == -1:
            return ""
        for k in self.dll.head.next.keys:
            break
        return k

相关文章

  • 8.22 - hard - 84

    432. All O`one Data Structure 基本的想法就是利用一个双向链表来维持单调性,每个nod...

  • 8.22 - hard - 85

    440. K-th Smallest in Lexicographical Order 和之前有一道386. Le...

  • 8.22 - hard - 86

    446. Arithmetic Slices II - Subsequence 一道dp的题目

  • 8.22 - hard - 87

    460. LFU Cache 有点做不动了。。。基本思想是。。。(这题要重看,先休息一会)

  • 8.22 - hard - 90

    471. Encode String with Shortest Length 一道对角线型dp题目,对角线是我自...

  • 8.22 - hard - 88

    465. Optimal Account Balancing 这道题挺有意思的,用greedy的方法

  • 8.22 - hard - 89

    466. Count The Repetitions这题好困难,看了答案也很难理解,估计只能背答案了。。。等复习的...

  • 8.22 - hard - 81

    411. Minimum Unique Word Abbreviation 利用比较基本的方法,backtrack...

  • 8.22 - hard - 83

    425. Word Squares 利用Trie和backtracking来做。利用trie来找prefix

  • 8.22 - hard - 82

    420. Strong Password Checker 这道题要分成几种情况做When len > 20, we...

网友评论

      本文标题:8.22 - hard - 84

      本文链接:https://www.haomeiwen.com/subject/grmrdxtx.html