日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

边工作边刷题:70天一遍leetcode: day 98

發(fā)布時間:2024/1/17 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 边工作边刷题:70天一遍leetcode: day 98 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

LRU Cache

這是一道leetcode的難題,這種題往往是算法結構很復雜,涉及一個或多個考點算法和數據結構的組合,同時又有很多corner cases要考慮。所以一定要找到合適memorize的結構,這樣很容易推導出整個題目的解。否則會不斷的記了忘忘了記。

這題分成大面上有兩個考點,一個是LRU算法本身,另一個是hash table和doubly list的操作。LRU算法圍繞兩個接口get() and put()。這題的internal data structure之所以是hash table和list的結合是因為接口支持基于key的操作,而進出則是基于順序,所以hash table用來支持key query,而list可以跟蹤訪問順序。用到doubly list是因為其支持list上單node的reference的所有操作,不需要同時保存prev或者next的reference。
high-level操作

  • get():從hash table查詢key value返回值,同時移動key對應的node到隊列頭
  • put():考慮兩種情況:key已經在cache中存在或者不存在。
    • 如果存在,與get的操作類似。
    • 如果不存在,因為LRU cache的capacity有限,進一步考慮是否當前cache中的key已經等于當前capacity
      • 如果等于,需要刪除list的最后node,然后插入新的到hash table和隊頭
      • 如果小于,直接插入新的到hash table和隊頭

low-level細節(jié)

  • 根據high-level算法,無論是更新存在的key或者加入新key,對list只有兩個基本操作removeNode()和addNodeToHead(),核心都是更新prev和next reference。無論是刪除還是添加,都有可能對隊頭node,所以需要一個dummy node作為sentinel head
  • corner cases:對于刪除操作,一般的操作是更新next node的prev,所以對于tail,其next node為null,需要忽略這步。類似,對于添加到隊頭操作,需要更新當前隊頭node的prev,所以如果是空list,也要忽略這步。
class LRUCache(object):class ListNode(object):def __init__(self, key, val):self.key = keyself.val = valself.next = Noneself.prev = Nonedef __init__(self, capacity):""":type capacity: int"""self.capacity = capacityself.size = 0self.hmap = {}self.dummy = self.ListNode(0,0)self.tail = self.dummydef get(self, key):""":rtype: int"""hmap=self.hmapif key not in hmap:return -1val = hmap[key].valself.deleteNode(hmap[key])self.addNode(hmap[key])return valdef set(self, key, value):""":type key: int:type value: int:rtype: nothing"""hmap=self.hmapif key not in hmap:print self.size,self.capacityif self.size==self.capacity:print self.tail.keyhmap.pop(self.tail.key)self.deleteNode(self.tail)self.size-=1hmap[key]=self.ListNode(key,value)self.addNode(hmap[key])self.size+=1else:hmap[key].val=valueself.deleteNode(hmap[key])self.addNode(hmap[key])def deleteNode(self, node):# print self.hmap, node.val, self.tail.valif self.tail==node:self.tail = self.tail.prevself.tail.next = Noneelse:node.prev.next = node.nextnode.next.prev = node.prevdef addNode(self, node):dummy = self.dummyif dummy.next:dummy.next.prev = nodeelse:self.tail = nodenode.prev = dummynode.next = dummy.nextdummy.next = node

轉載于:https://www.cnblogs.com/absolute/p/5983282.html

總結

以上是生活随笔為你收集整理的边工作边刷题:70天一遍leetcode: day 98的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。