zoukankan      html  css  js  c++  java
  • 边工作边刷题:70天一遍leetcode: day 8-2

    LRU Cache

    这题调了好几天才pass
    要点:用doubly linked list,

    • deleteNode和addNode分开考虑,分开考虑,分开考虑,重要的事情说三遍
    • 需要dummy node和tail,deleteNode考虑tail,addNode考虑dummy.next(因为addNode alway加头)
    • set():最外分支是是否key已经在map里(在表示update),没在always加头

    错误点:

    • 空间满了以后先size--,这样空间未满的情况统一处理,注意别忘了size++
    • remove key from hmap顺序反了,固化:永远在改变结点之前。
    • 这题错误大多在deleteNode和addNode里,而且很难debug,比如,忘了连接dummy.next
    class LRUCache(object):
        class ListNode(object):
            def __init__(self, key, val):
                self.key = key
                self.val = val
                self.next = None
                self.prev = None
        
        def __init__(self, capacity):
            """
            :type capacity: int
            """
            self.capacity = capacity
            self.size = 0
            self.hmap = {}
            self.dummy = self.ListNode(0,0)
            self.tail = self.dummy
    
        def get(self, key):
            """
            :rtype: int
            """
            hmap=self.hmap
            if key not in hmap:
                return -1
                
            val = hmap[key].val
            self.deleteNode(hmap[key])
            self.addNode(hmap[key])
            return val
    
        def set(self, key, value):
            """
            :type key: int
            :type value: int
            :rtype: nothing
            """
            hmap=self.hmap
            if key not in hmap:
                print self.size,self.capacity
                if self.size==self.capacity:
                    print self.tail.key
                    hmap.pop(self.tail.key)
                    self.deleteNode(self.tail)
                    self.size-=1
                hmap[key]=self.ListNode(key,value)
                self.addNode(hmap[key])
                self.size+=1
            else:
                hmap[key].val=value
                self.deleteNode(hmap[key])
                self.addNode(hmap[key])
            
        def deleteNode(self, node):
            # print self.hmap, node.val, self.tail.val
            if self.tail==node:
                self.tail = self.tail.prev
                self.tail.next = None
            else:
                node.prev.next = node.next
                node.next.prev = node.prev
            
        def addNode(self, node):
            dummy = self.dummy
            if dummy.next:
                dummy.next.prev = node
            else:
                self.tail = node
            node.prev = dummy
            node.next = dummy.next
            dummy.next = node
    
    
  • 相关阅读:
    js Image对象 及rollover效果
    精通javascript:元素的尺寸
    javascript 快捷操作
    精通javascript:获取位置
    javascript对象小问题
    javascript 获取元素的真实,最终的css样式
    MySQL索引
    精通javascript:元素的可见性
    javascript 图像预载入和如何判断图片是否加载完成
    ASP.NET Ajax的CalendarExtender控件被其它Div遮住问题
  • 原文地址:https://www.cnblogs.com/absolute/p/5675758.html
Copyright © 2011-2022 走看看