代码随想录算法训练营第五十九天| 503.下一个更大元素II、42. 接雨水
503.下一个更大元素II
题目链接: 503.下一个更大元素II
解题代码
func nextGreaterElements(nums []int) []int {
length := len(nums)
result := make([]int,length,length)
for i:=0;i<len(result);i++{
result[i] = -1
}
//单调递减,存储数组下标索引
stack := make([]int,0)
for i:=0;i<length*2;i++{
for len(stack)>0&&nums[i%length]>nums[stack[len(stack)-1]]{
index := stack[len(stack)-1]
stack = stack[:len(stack)-1] // pop
result[index] = nums[i%length]
}
stack = append(stack,i%length)
}
return result
}
42. 接雨水
题目链接:42. 接雨水
解题代码
func trap(height []int) int {
if len(height) <= 2 {
return 0
}
st := make([]int, 1, len(height)) // 切片模拟单调栈,st存储的是高度数组下标
var res int
for i := 1; i < len(height); i++ {
if height[i] < height[st[len(st)-1]] {
st = append(st, i)
} else if height[i] == height[st[len(st)-1]] {
st = st[:len(st)-1] // 比较的新元素和栈顶的元素相等,去掉栈中的,入栈新元素下标
st = append(st, i)
} else {
for len(st) != 0 && height[i] > height[st[len(st)-1]] {
top := st[len(st)-1]
st = st[:len(st)-1]
if len(st) != 0 {
tmp := (min(height[i], height[st[len(st)-1]]) - height[top]) * (i - st[len(st)-1] - 1)
res += tmp
}
}
st = append(st, i)
}
}
return res
}
func min(x, y int) int {
if x >= y {
return y
}
return x
}