This repository was archived by the owner on Sep 20, 2023. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 164
/
Copy pathodd-even-jump.go
executable file
·81 lines (69 loc) · 1.49 KB
/
odd-even-jump.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package problem0975
import "sort"
// ref: https://leetcode.com/problems/odd-even-jump/discuss/217981/JavaC%2B%2BPython-DP-idea-Using-TreeMap-or-Stack
func oddEvenJumps(A []int) int {
size := len(A)
indexs := make([]int, size)
for i := range indexs {
indexs[i] = i
}
sort.Slice(indexs, func(i int, j int) bool {
if A[indexs[i]] == A[indexs[j]] {
return indexs[i] < indexs[j]
}
return A[indexs[i]] < A[indexs[j]]
})
nextHigher := nextIndex(indexs)
ascToDes(A, indexs)
nextLower := nextIndex(indexs)
higher, lower := make([]int, size), make([]int, size)
higher[size-1], lower[size-1] = 1, 1
for i := size - 2; i >= 0; i-- {
higher[i], lower[i] = lower[nextHigher[i]], higher[nextLower[i]]
}
return sum(higher)
}
func nextIndex(indexs []int) []int {
size := len(indexs)
res := make([]int, size)
stack := make([]int, 0, size)
for _, j := range indexs {
for len(stack) > 0 && stack[len(stack)-1] < j {
pop := stack[len(stack)-1]
res[pop] = j
stack = stack[:len(stack)-1]
}
stack = append(stack, j)
}
return res
}
func ascToDes(A, indexs []int) {
i, size := 0, len(A)
for i+1 < size {
if A[indexs[i]] != A[indexs[i+1]] {
i++
continue
}
a, j := A[indexs[i]], i+1
for j+1 < size && A[indexs[j+1]] == a {
j++
}
reverse(indexs, i, j)
i = j + 1
}
reverse(indexs, 0, size-1)
}
func reverse(A []int, i, j int) {
for i < j {
A[i], A[j] = A[j], A[i]
i++
j--
}
}
func sum(A []int) int {
res := 0
for _, a := range A {
res += a
}
return res
}