Skip to content

Commit

Permalink
LRU Cache added.
Browse files Browse the repository at this point in the history
  • Loading branch information
iHackSubhodip committed Apr 15, 2019
1 parent 5af0fa4 commit 5acf57b
Show file tree
Hide file tree
Showing 2 changed files with 80 additions and 0 deletions.
75 changes: 75 additions & 0 deletions Design/LRUCache.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
/**
* Question Link: https://leetcode.com/problems/lru-cache/
* Primary idea: Use Doubly linked list and hash table to build the LRU cache.
* Time Complexity: O(1), Space Complexity: O(n)
*
*/

class DoublyLinkedList{
var key: Int
var value: Int
var previous: DoublyLinkedList?
var next: DoublyLinkedList?
var hashValue: Int

init(_ key: Int, _ value: Int) {
self.key = key
self.value = value
self.hashValue = key
}
}

class LRUCache{
var maxCapacity: Int
var head: DoublyLinkedList
var tail: DoublyLinkedList
var cache: [Int: DoublyLinkedList]

init(_ maxCapacity: Int) {
self.maxCapacity = maxCapacity
self.cache = [Int: DoublyLinkedList]()
self.head = DoublyLinkedList(Int.min, Int.min)
self.tail = DoublyLinkedList(Int.max, Int.max)
self.head.next = self.tail
self.tail.previous = self.head
}

func add(_ node: DoublyLinkedList){
let next = head.next
head.next = node
node.previous = head
node.next = next
next?.previous = node
}

func remove(_ node: DoublyLinkedList){
let previous = node.previous
let next = node.next
previous?.next = next
next?.previous = previous
}

func get(_ key: Int) -> Int{
if let node = cache[key]{
remove(node)
add(node)
return node.value
}
return -1
}

func put(_ key: Int, _ value: Int){
if let node = cache[key]{
remove(node)
cache.removeValue(forKey: key)
}else if cache.keys.count >= maxCapacity{
if let leastNode = tail.previous{
remove(leastNode)
cache.removeValue(forKey: leastNode.key)
}
}
let newNode = DoublyLinkedList(key, value)
cache[key] = newNode
add(newNode)
}
}
5 changes: 5 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -348,6 +348,11 @@
[Graph Valid Tree](https://leetcode.com/problems/graph-valid-tree/)| [Swift](./UnionFind/GraphValidTree.swift)| Medium| O(nlogn)| O(n)|
[Number of Islands II](https://leetcode.com/problems/number-of-islands-ii/)| [Swift](./UnionFind/NumberIslandsII.swift)| Hard| O(klogmn)| O(mn)|

## Design
| Title | Solution | Difficulty | Time | Space |
| ----- | -------- | ---------- | ---- | ----- |
[LRU Cache](https://leetcode.com/problems/lru-cache/)| [Swift](./Design/LRUCache.swift)| Hard| O(1)| O(n)|

## Google
| Title | Solution | Difficulty | Frequency |
| ----- | -------- | ---------- | --------- |
Expand Down

0 comments on commit 5acf57b

Please sign in to comment.