|
|
@@ -0,0 +1,23 @@
|
|
|
+func nextGreaterElements(nums []int) []int {
|
|
|
+ n := len(nums)
|
|
|
+ next := make([]int, n)
|
|
|
+ if n == 0 {
|
|
|
+ return next
|
|
|
+ }
|
|
|
+ next[0] = -1
|
|
|
+ for i := 1; i < n; i *= 2 {
|
|
|
+ copy(next[i:], next[:i])
|
|
|
+ }
|
|
|
+ st := make([]int, 0)
|
|
|
+ l := 0
|
|
|
+ for i := 0; i < 2*n; i++ { // Keep a decreasing stack, and traversal for twice
|
|
|
+ for l != 0 && nums[st[l-1]] < nums[i%n] {
|
|
|
+ next[st[l-1]] = nums[i%n]
|
|
|
+ st = st[:l-1]
|
|
|
+ l--
|
|
|
+ }
|
|
|
+ st = append(st, i%n)
|
|
|
+ l++
|
|
|
+ }
|
|
|
+ return next
|
|
|
+}
|