Skip to content

Commit 1eeb408

Browse files
authoredAug 23, 2024··
Merge pull request #719 from fartem/146_LRU_Cache
2024-08-23 v. 6.5.4: added "146. LRU Cache"
2 parents 543fbdc + 132c69b commit 1eeb408

File tree

4 files changed

+126
-1
lines changed

4 files changed

+126
-1
lines changed
 

‎README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -519,3 +519,4 @@ Profile on LeetCode: [fartem](https://leetcode.com/fartem/).
519519
| 138. Copy List with Random Pointer | [Link](https://leetcode.com/problems/copy-list-with-random-pointer/) | [Link](./lib/medium/138_copy_list_with_random_pointer.rb) | [Link](./test/medium/test_138_copy_list_with_random_pointer.rb) |
520520
| 142. Linked List Cycle II | [Link](https://leetcode.com/problems/linked-list-cycle-ii/) | [Link](./lib/medium/142_linked_list_cycle_ii.rb) | [Link](./test/medium/test_142_linked_list_cycle_ii.rb) |
521521
| 143. Reorder List | [Link](https://leetcode.com/problems/reorder-list/) | [Link](./lib/medium/143_reorder_list.rb) | [Link](./test/medium/test_143_reorder_list.rb) |
522+
| 146. LRU Cache | [Link](https://leetcode.com/problems/lru-cache/) | [Link](./lib/medium/146_lru_cache.rb) | [Link](./test/medium/test_146_lru_cache.rb) |

‎leetcode-ruby.gemspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ require 'English'
55
::Gem::Specification.new do |s|
66
s.required_ruby_version = '>= 3.0'
77
s.name = 'leetcode-ruby'
8-
s.version = '6.5.3'
8+
s.version = '6.5.4'
99
s.license = 'MIT'
1010
s.files = ::Dir['lib/**/*.rb'] + %w[README.md]
1111
s.executable = 'leetcode-ruby'

‎lib/medium/146_lru_cache.rb

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
# frozen_string_literal: true
2+
3+
# https://leetcode.com/problems/lru-cache/
4+
class LRUCache
5+
# @param {Integer} capacity
6+
def initialize(capacity)
7+
@capacity = capacity
8+
@head = ::Node.new
9+
@tail = ::Node.new
10+
@cache = {}
11+
12+
@head.next = @tail
13+
@tail.prev = @head
14+
end
15+
16+
# @param {Integer} key
17+
# @return {Integer}
18+
def get(key)
19+
node = @cache[key]
20+
21+
return -1 unless node
22+
23+
remove(node)
24+
add(node)
25+
26+
node.val
27+
end
28+
29+
# @param {Integer} key
30+
# @param {Integer} value
31+
# @return {Void}
32+
def put(key, value)
33+
node = @cache[key]
34+
35+
if node
36+
remove(node)
37+
node.val = value
38+
else
39+
if @cache.size == @capacity
40+
@cache.delete(@tail.prev.key)
41+
remove(@tail.prev)
42+
end
43+
44+
node = ::Node.new
45+
node.key = key
46+
node.val = value
47+
@cache[key] = node
48+
end
49+
50+
add(node)
51+
end
52+
53+
private
54+
55+
# @param {Node} node
56+
# @return {Void}
57+
def add(node)
58+
nxt = @head.next
59+
@head.next = node
60+
nxt.prev = node
61+
node.next = nxt
62+
node.prev = @head
63+
end
64+
65+
# @param {Node} node
66+
# @return {Void}
67+
def remove(node)
68+
nxt = node.next
69+
prev = node.prev
70+
nxt.prev = prev
71+
prev.next = nxt
72+
end
73+
end
74+
75+
private
76+
77+
# Cache node
78+
class Node
79+
attr_accessor :key, :val, :prev, :next
80+
81+
# Constructor with default parameters
82+
def initialize
83+
@key = 0
84+
@val = 0
85+
@prev = nil
86+
@next = nil
87+
end
88+
end

‎test/medium/test_146_lru_cache.rb

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# frozen_string_literal: true
2+
3+
require_relative '../test_helper'
4+
require_relative '../../lib/medium/146_lru_cache'
5+
require 'minitest/autorun'
6+
7+
class LRUCacheTest < ::Minitest::Test
8+
def test_default_one
9+
lru_cache = ::LRUCache.new(2)
10+
lru_cache.put(1, 1)
11+
lru_cache.put(2, 2)
12+
13+
assert_equal(1, lru_cache.get(1))
14+
15+
lru_cache.put(3, 3)
16+
17+
assert_equal(-1, lru_cache.get(2))
18+
19+
lru_cache.put(4, 4)
20+
21+
assert_equal(-1, lru_cache.get(1))
22+
assert_equal(3, lru_cache.get(3))
23+
assert_equal(4, lru_cache.get(4))
24+
end
25+
26+
def test_additional_one
27+
lru_cache = ::LRUCache.new(1)
28+
lru_cache.put(1, 1)
29+
30+
assert_equal(1, lru_cache.get(1))
31+
32+
lru_cache.put(1, 2)
33+
34+
assert_equal(2, lru_cache.get(1))
35+
end
36+
end

0 commit comments

Comments
 (0)
Please sign in to comment.