class
dlinkednode
:def
__init__
(self, key=
0, value=0)
: self.key = key
self.value = value
self.prev =
none
self.
next
=none
class
lrucache
:def
__init__
(self, capacity:
int)
: self.cache =
dict()
# 使用偽頭部和偽尾部節點
self.head = dlinkednode(
) self.tail = dlinkednode(
) self.head.
next
= self.tail
self.tail.prev = self.head
self.capacity = capacity
self.size =
0def
get(self, key:
int)
->
int:
if key not
in self.cache:
return-1
# 如果 key 存在,先通過雜湊表定位,再移到頭部
node = self.cache[key]
self.movetohead(node)
return node.value
defput(self, key:
int, value:
int)
->
none
:if key not
in self.cache:
# 如果 key 不存在,建立乙個新的節點
node = dlinkednode(key, value)
# 新增進雜湊表
self.cache[key]
= node
# 新增至雙向鍊錶的頭部
self.addtohead(node)
self.size +=
1if self.size > self.capacity:
# 如果超出容量,刪除雙向鍊錶的尾部節點
removed = self.removetail(
)# 刪除雜湊表中對應的項
self.cache.pop(removed.key)
self.size -=
1else
:# 如果 key 存在,先通過雜湊表定位,再修改 value,並移到頭部
node = self.cache[key]
node.value = value
self.movetohead(node)
defaddtohead
(self, node)
: node.prev = self.head
node.
next
= self.head.
next
self.head.
next
.prev = node
self.head.
next
= node
defremovenode
(self, node)
: node.prev.
next
= node.
next
node.
next
.prev = node.prev
defmovetohead
(self, node)
: self.removenode(node)
self.addtohead(node)
defremovetail
(self)
: node = self.tail.prev
self.removenode(node)
return node
lru(最近最少使用演算法) 146 leetcode
實現雜湊表加雙向鍊錶
雜湊表儲存key與key指向的node,目的能夠o(1)的查詢
雙向鍊錶儲存位置資訊,最早使用的放在最後,能夠o(1)的加入快取;當溢位的時候能夠o(1)的刪除節點
學習演算法第三題
問題 判斷整數是否是回文。ps 回文 把相同的詞彙或句子 在下文中調換位置或顛倒過來,產生首尾回環的情趣,叫做回文,也叫回環。要求 不能將整數轉化成字串!示例1 輸入 121 輸出 true 說明 從左到右,顯示121 從右到左,顯示121 因此為回文。示例2 輸入 121 輸出 false 說明 ...
leetcode演算法第三題
給定乙個字串,請你找出其中不含有重複字元的 最長子串 的長度。示例 1 輸入 s abcabcbb 輸出 3 解釋 因為無重複字元的最長子串是 abc 所以其長度為 3。示例 2 輸入 s bbbbb 輸出 1 解釋 因為無重複字元的最長子串是 b 所以其長度為 1。示例 3 輸入 s pwwkew...
演算法打卡第三題(陣列 移除元素)
題目 解題思路 我認為這一題移除元素與我做的上一題刪除重複元素有異曲同工之妙,不同的是,題目已經給定了我們乙個val值,讓我們與陣列中的值一一比較,唯一的難點就是第乙個值如何移除,這裡我們同意需要定義乙個新的變數length表示新陣列的長度,賦length 0,這裡我們像上題賦length初值為1的...