Skip to content

Commit 1e2e936

Browse files
author
lucifer
committed
feat: 春招冲冲冲
1 parent c8bf727 commit 1e2e936

File tree

3 files changed

+82
-30
lines changed

3 files changed

+82
-30
lines changed

README.md

+9
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,14 @@
3131

3232
> epub 还是有动图的
3333
34+
## 春招冲冲冲
35+
36+
春招已经开始了。你是不是已经开始准备了呢?为了帮助大家获得更好的 offer,lucifer 开辟了「春招冲冲冲」栏目。
37+
38+
第一期我们的猎物是「虾皮」。来看看虾皮的算法题难度几何吧!
39+
40+
- [春招冲冲冲](https://mp.weixin.qq.com/s?__biz=MzI4MzUxNjI3OA==&mid=2247487632&idx=1&sn=830fe267d835e5acbfc417787f85f1c1&chksm=eb88dc89dcff559f49913c0f2dec77b1d06c2ddbe2c6c299b32b3e49c2efaf8b11ac0aedce8f&token=1676518002&lang=zh_CN#rd)
41+
3442
## :information_desk_person:订阅公众号
3543

3644
有些内容只在公众号发布,因此大家觉得内容不错的话,可以关注一下。如果再给 ➕ 个星标就更棒啦!
@@ -381,6 +389,7 @@ leetcode 题解,记录自己的 leetcode 解题之路。
381389
- [0128. 最长连续序列](./problems/128.longest-consecutive-sequence.md)
382390
- [0140. 单词拆分 II](problems/140.word-break-ii.md)
383391
- [0145. 二叉树的后序遍历](./problems/145.binary-tree-postorder-traversal.md)
392+
- [0146. LRU 缓存机制](./problems/146.lru-cache.md)
384393
- [0212. 单词搜索 II](./problems/212.word-search-ii.md)
385394
- [0239. 滑动窗口最大值](./problems/239.sliding-window-maximum.md)
386395
- [0295. 数据流的中位数](./problems/295.find-median-from-data-stream.md)

SUMMARY.md

+1
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,7 @@
254254
- [0128. 最长连续序列](./problems/128.longest-consecutive-sequence.md)
255255
- [0140. 单词拆分 II](problems/140.word-break-ii.md)
256256
- [0145. 二叉树的后序遍历](./problems/145.binary-tree-postorder-traversal.md)
257+
- [0146. LRU 缓存机制](./problems/146.lru-cache.md)
257258
- [0212. 单词搜索 II](./problems/212.word-search-ii.md)
258259
- [0239. 滑动窗口最大值](./problems/239.sliding-window-maximum.md)
259260
- [0295. 数据流的中位数](./problems/295.find-median-from-data-stream.md)

problems/146.lru-cache.md

+72-30
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ function put (key, value) {
105105

106106
## 代码
107107

108-
语言支持: JS, Go, PHP, CPP
108+
语言支持: JS, Go, PHP, Python3
109109

110110
JS Code:
111111

@@ -377,36 +377,78 @@ class DoubleList
377377
}
378378
```
379379

380-
CPP Code:
381-
382-
```cpp
383-
class LRUCache {
384-
private:
385-
list<pair<int, int>> data;
386-
unordered_map<int, list<pair<int, int>>::iterator> m;
387-
int capacity;
388-
public:
389-
LRUCache(int capacity) : capacity(capacity) {}
390-
391-
int get(int key) {
392-
if (!m.count(key)) return -1;
393-
data.splice(data.begin(), data, m[key]);
394-
m[key] = data.begin();
395-
return data.front().second;
396-
}
380+
Python Code:
381+
382+
> 来自 leetcode
383+
384+
```py
385+
class DLinkedNode:
386+
def __init__(self, key=0, value=0):
387+
self.key = key
388+
self.value = value
389+
self.prev = None
390+
self.next = None
391+
392+
393+
class LRUCache:
394+
def __init__(self, capacity: int):
395+
self.cache = dict()
396+
# 使用伪头部和伪尾部节点
397+
self.head = DLinkedNode()
398+
self.tail = DLinkedNode()
399+
self.head.next = self.tail
400+
self.tail.prev = self.head
401+
self.capacity = capacity
402+
self.size = 0
403+
404+
def get(self, key: int) -> int:
405+
if key not in self.cache:
406+
return -1
407+
# 如果 key 存在,先通过哈希表定位,再移到头部
408+
node = self.cache[key]
409+
self.moveToHead(node)
410+
return node.value
411+
412+
def put(self, key: int, value: int) -> None:
413+
if key not in self.cache:
414+
# 如果 key 不存在,创建一个新的节点
415+
node = DLinkedNode(key, value)
416+
# 添加进哈希表
417+
self.cache[key] = node
418+
# 添加至双向链表的头部
419+
self.addToHead(node)
420+
self.size += 1
421+
if self.size > self.capacity:
422+
# 如果超出容量,删除双向链表的尾部节点
423+
removed = self.removeTail()
424+
# 删除哈希表中对应的项
425+
self.cache.pop(removed.key)
426+
self.size -= 1
427+
else:
428+
# 如果 key 存在,先通过哈希表定位,再修改 value,并移到头部
429+
node = self.cache[key]
430+
node.value = value
431+
self.moveToHead(node)
432+
433+
def addToHead(self, node):
434+
node.prev = self.head
435+
node.next = self.head.next
436+
self.head.next.prev = node
437+
self.head.next = node
438+
439+
def removeNode(self, node):
440+
node.prev.next = node.next
441+
node.next.prev = node.prev
442+
443+
def moveToHead(self, node):
444+
self.removeNode(node)
445+
self.addToHead(node)
446+
447+
def removeTail(self):
448+
node = self.tail.prev
449+
self.removeNode(node)
450+
return node
397451

398-
void put(int key, int value) {
399-
if (get(key) == -1) {
400-
if (data.size() == capacity) {
401-
auto p = data.back();
402-
m.erase(p.first);
403-
data.pop_back();
404-
}
405-
data.emplace_front(key, value);
406-
m[key] = data.begin();
407-
} else data.front().second = value;
408-
}
409-
};
410452
```
411453

412454
**复杂度分析**

0 commit comments

Comments
 (0)