边工作边刷题:70天一遍leetcode: day 98
生活随笔
收集整理的這篇文章主要介紹了
边工作边刷题: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,也要忽略這步。
轉載于:https://www.cnblogs.com/absolute/p/5983282.html
總結
以上是生活随笔為你收集整理的边工作边刷题:70天一遍leetcode: day 98的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle SQL语句收集
- 下一篇: IE edge是怎么了??