leetcode刷题笔记——单调栈

1.模板:

stack<int> st;
st.push(0);
for(int i = 1; i < nums.size(); i++){
	while(!st.empty() && st.top() > nums[i]){
		st.pop();
        //计算、存放结果
	}
	st.push(nums[i]);
}
 

2.注意事项⭐:

(1)需要注意单调栈中stack存放元素为nums数组的下标还是nums数组中的元素。

例如:如果存放的是下标,比较时需要比较height[i]和height[left.top()],如果存放的是元素,则需比较height[i]和left.top()

(2)单调栈常常需要先 st.push(0),再从1开始遍历

(3)遍历栈中元素时需要pop掉栈顶元素时,要提前记录栈的大小,否则pop出去时,栈的大小改变,无法遍历完栈中元素

(4)单调栈需要搞清楚遇到相同大小元素时,后一个是否需要入栈(常常是需要)

错误示例×:

stack<int> st;

//由于上一轮循环中pop掉了栈顶元素,栈的大小也随之改变,无法遍历完栈中所有元素
for(int i=0;i<st.size();i++){
    //对栈顶元素进行处理
    //..
    st.pop();
}

正确做法:

stack<int> st;
int len=st.size();

for(int i=0;i<len;i++){
    //对st.top()做必要的处理
    //..
    st.pop();
}

3.边界情况:要考虑各种边界情况,可代入特例进行检验

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值