func nextGreaterElements(nums []int) []int {
// 初始化结果集和栈
res := make([]int, len(nums))
for i := range res {
res[i] = -1
}
stack := []int{0}
for i := 1; i < len(nums)*2; i++ {
top := stack[len(stack)-1]
if nums[i%len(nums)] <= nums[top] {
stack = append(stack, i%len(nums))
} else {
for len(stack) != 0 && nums[i%len(nums)] > nums[top] {
res[top] = nums[i%len(nums)]
stack = stack[:len(stack)-1] //弹出元素
if len(stack) != 0 {
top = stack[len(stack)-1]
}
}
stack = append(stack, i%len(nums))
}
}
return res
}
func trap(height []int) int {
if len(height) <= 2 {
return 0
}
//初始化单调栈和结果集
stack := []int{0}
sum := 0
for i := 1; i < len(height); i++ {
top := stack[len(stack)-1]
if height[i] <= height[top] {
stack = append(stack, i)
} else {
for len(stack) != 0 && height[i] > height[top] {
mid := stack[len(stack)-1]
//弹出栈顶元素
stack = stack[:len(stack)-1]
if len(stack) != 0 {
top = stack[len(stack)-1]
h := min(height[i], height[top]) - height[mid]
w := i - top - 1 //注意这里w要减1
sum += h * w
}
}
stack = append(stack, i)
}
}
return sum
}