单调栈不需要太多的文字定义,单调栈三个字,你理解的是什么就是什么
关键是怎么解题
出现不满足单调的元素,那么从栈顶开始清算到满足单调为止
不满足者的出现,导致开始清算,清算了最后一个元素,可能按照不满足者的标准也可以刷新记录(可能往左延伸的)所以有这几类问题
- 往左延伸有意义的。
- 以及往左延伸无意义的
往左延伸无意义的
- 未来哪天比今天温度高
func dailyTemperatures(temperatures []int) []int {
stack:=[]int{}
res:=make([]int,len(temperatures))
temperatures=append(temperatures,101)
invalidIndex:=len(temperatures)-1
index:=0
for index<len(temperatures) {
if len(stack)==0 || temperatures[index] <= temperatures[stack[len(stack)-1]]{
stack=append(stack,index)
index++
}else{ //该温度比栈顶大,那么一直“清算”到栈顶小于等于该温度
for len(stack)>0{
top:=stack[len(stack)-1]
if temperatures[index]<=temperatures[top]{ //清算截止
stack=append(stack,index)
index++
break
}
if index==invalidIndex{ //大温度“清算”
res[top]=0
}else{
res[top]=index-top
}
stack=stack[:len(stack)-1]
}
}
}
return res
}
往左延伸有意义的
计算最大矩形
区间和乘以区间最小值