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 }