503.next-greater-element-ii.go 446 B

1234567891011121314151617181920212223
  1. func nextGreaterElements(nums []int) []int {
  2. n := len(nums)
  3. next := make([]int, n)
  4. if n == 0 {
  5. return next
  6. }
  7. next[0] = -1
  8. for i := 1; i < n; i *= 2 {
  9. copy(next[i:], next[:i])
  10. }
  11. st := make([]int, 0)
  12. l := 0
  13. for i := 0; i < 2*n; i++ { // Keep a decreasing stack, and traversal for twice
  14. for l != 0 && nums[st[l-1]] < nums[i%n] {
  15. next[st[l-1]] = nums[i%n]
  16. st = st[:l-1]
  17. l--
  18. }
  19. st = append(st, i%n)
  20. l++
  21. }
  22. return next
  23. }