|
@@ -1,3 +1,50 @@
|
|
|
|
+type minHeap []int // Stores the length only
|
|
|
|
+
|
|
|
|
+func (h minHeap) Len() int { return len(h) }
|
|
|
|
+func (h minHeap) Less(i, j int) bool { return h[i] < h[j] }
|
|
|
|
+func (h minHeap) Swap(i, j int) { h[i], h[j] = h[j], h[i] }
|
|
|
|
+
|
|
|
|
+func (h *minHeap) Push(x interface{}) {
|
|
|
|
+ *h = append(*h, x.(int))
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func (h *minHeap) Pop() interface{} {
|
|
|
|
+ l := len(*h)
|
|
|
|
+ x := (*h)[l-1]
|
|
|
|
+ *h = (*h)[0 : l-1]
|
|
|
|
+ return x
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+var m map[int]*minHeap
|
|
|
|
+
|
|
func isPossible(nums []int) bool {
|
|
func isPossible(nums []int) bool {
|
|
-
|
|
|
|
|
|
+ m = make(map[int]*minHeap)
|
|
|
|
+ for _, num := range nums {
|
|
|
|
+ last := helper(num - 1)
|
|
|
|
+ l := 0
|
|
|
|
+ if last.Len() != 0 {
|
|
|
|
+ l = heap.Pop(last).(int)
|
|
|
|
+ }
|
|
|
|
+ curr := helper(num)
|
|
|
|
+ heap.Push(curr, l+1)
|
|
|
|
+ }
|
|
|
|
+ for _, v := range m {
|
|
|
|
+ h := *v
|
|
|
|
+ for _, l := range h {
|
|
|
|
+ if l < 3 {
|
|
|
|
+ return false
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return true
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func helper(num int) *minHeap {
|
|
|
|
+ if h, ok := m[num]; ok {
|
|
|
|
+ return h
|
|
|
|
+ } else {
|
|
|
|
+ var h minHeap
|
|
|
|
+ m[num] = &h
|
|
|
|
+ return &h
|
|
|
|
+ }
|
|
}
|
|
}
|