dengxinyi 6 years ago
parent
commit
b23c1930fa
3 changed files with 136 additions and 0 deletions
  1. 114 0
      hard/146.go
  2. 16 0
      hard/149.go
  3. 6 0
      hard/helper.go

+ 114 - 0
hard/146.go

@@ -0,0 +1,114 @@
+package main
+
+// BiListNode ...
+type BiListNode struct {
+	Key  int
+	Val  int
+	Prev *BiListNode
+	Next *BiListNode
+}
+
+// LRUCache ...
+type LRUCache struct {
+	Cap   int
+	Size  int
+	Head  *BiListNode
+	Tail  *BiListNode
+	Cache map[int]*BiListNode
+}
+
+// Constructor ...
+func Constructor(capacity int) (cache LRUCache) {
+	cache.Cap, cache.Size = capacity, 0
+	cache.Cache = make(map[int]*BiListNode)
+	return
+}
+
+// Get ...
+func (cache *LRUCache) Get(key int) int {
+	if node, ok := cache.Cache[key]; ok {
+		if node != cache.Head {
+			if node == cache.Tail {
+				cache.Tail = cache.Tail.Prev
+			}
+			// Delete node
+			if node.Next != nil {
+				node.Next.Prev = node.Prev
+			}
+			node.Prev.Next = node.Next
+			// node is the new Head
+			node.Prev = nil
+			node.Next = cache.Head
+			cache.Head.Prev = node
+			cache.Head = node
+			// Update Tail
+			if cache.Tail == nil {
+				cache.Tail = cache.Head
+			}
+		}
+		return node.Val
+	}
+	return -1
+}
+
+// Put ...
+func (cache *LRUCache) Put(key int, value int) {
+	if node, ok := cache.Cache[key]; ok {
+		if node != cache.Head {
+			if node == cache.Tail {
+				cache.Tail = cache.Tail.Prev
+			}
+			// Delete node
+			if node.Next != nil {
+				node.Next.Prev = node.Prev
+			}
+			node.Prev.Next = node.Next
+			// node is the new Head
+			node.Prev = nil
+			node.Next = cache.Head
+			cache.Head.Prev = node
+			cache.Head = node
+			// Update Tail
+			if cache.Tail == nil {
+				cache.Tail = cache.Head
+			}
+		}
+		cache.Head.Val = value
+	} else {
+		node := &BiListNode{key, value, nil, cache.Head}
+		if cache.Size == 0 {
+			cache.Tail = node
+		} else {
+			cache.Head.Prev = node
+		}
+		cache.Head = node
+		cache.Size++
+		if cache.Size > cache.Cap {
+			delete(cache.Cache, cache.Tail.Key)
+			cache.Tail = cache.Tail.Prev
+			cache.Tail.Next = nil
+			cache.Size--
+		}
+		cache.Cache[key] = cache.Head
+	}
+}
+
+/**
+ * Your LRUCache object will be instantiated and called as such:
+ * obj := Constructor(capacity);
+ * param_1 := obj.Get(key);
+ * obj.Put(key,value);
+ */
+
+// func main() {
+// 	cache := Constructor(2 /* capacity */)
+// 	cache.Put(1, 1)
+// 	cache.Put(2, 2)
+// 	println(cache.Get(1)) // returns 1
+// 	cache.Put(3, 3)       // evicts key 2
+// 	println(cache.Get(2)) // returns -1 (not found)
+// 	cache.Put(4, 4)       // evicts key 1
+// 	println(cache.Get(1)) // returns -1 (not found)
+// 	println(cache.Get(3)) // returns 3
+// 	println(cache.Get(4)) // returns 4
+// }

+ 16 - 0
hard/149.go

@@ -0,0 +1,16 @@
+package main
+
+/**
+ * Definition for a point.
+ * type Point struct {
+ *     X int
+ *     Y int
+ * }
+ */
+func maxPoints(points []Point) int {
+	return 0
+}
+
+func main() {
+
+}

+ 6 - 0
hard/helper.go

@@ -13,6 +13,12 @@ func newInt(n int) Integer {
 	return i
 }
 
+// Point ...
+type Point struct {
+	X int
+	Y int
+}
+
 // ListNode ...
 type ListNode struct {
 	Val  int