@@ -105,7 +105,7 @@ function put (key, value) {
105
105
106
106
## 代码
107
107
108
- 语言支持: JS, Go, PHP, CPP
108
+ 语言支持: JS, Go, PHP, Python3
109
109
110
110
JS Code:
111
111
@@ -377,36 +377,78 @@ class DoubleList
377
377
}
378
378
```
379
379
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
397
451
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
- };
410
452
```
411
453
412
454
** 复杂度分析**
0 commit comments