力扣刷题-递归栈问题

1.单调递增栈
2.模板如下

    for(int i = 0; i < prices.size(); i ++) {
        while(stk.size() && prices[i] <= prices[stk.top()]) {//一定要记住这里还有一个很重要的 栈不为空的条件
            res[stk.top()] = prices[stk.top()]- prices[i];
            stk.pop();
        }
        stk.push(i);
    }

3.规律
找右边更小的数,单调递增栈,符号 <,
找右边小于等于的数,单调递增栈,符号 <=,题1475 商品折扣后的最终价格
找右边更大的数,单调递减栈,符号 >,题739 每日温度
找右边更大的数,单调递减栈,符号 >=,题901 股票价格跨度
代码

总结出一个思路:
就是只要是看到找离自己最近的最大的或者最小的数,就都可以想递归栈的思路!!!

然后就根据模板来,反正一般第一个数都是推进栈中,然后根据后面的逻辑判断,看一下是需要大于还是小于。对反正就是第一个数必定推进去,然后你再根据题意看第二个数是要继续进去,还是替换第一个数,因此判断大于小于符号!

1475和739就是典型的简单找右边更小或更大的数。

901

编写一个 StockSpanner 类,它收集某些股票的每日报价,并返回该股票当日价格的跨度。

今天股票价格的跨度被定义为股票价格小于或等于今天价格的最大连续日数(从今天开始往回数,包括今天)。

例如,如果未来7天股票的价格是 [100, 80, 60, 70, 60, 75, 85],那么股票跨度将是 [1, 1, 1, 2, 1, 4, 6]。

class StockSpanner {
Stack prices, weights;
public StockSpanner() {
prices=new Stack();
weights=new Stack();

}

public int next(int price) {
    int weight=1;
    while(!prices.empty()&&prices.peek()<=price)
    {
      prices.pop();
      weight=weight+weights.pop();
        
    }
    prices.push(price);
    weights.push(weight);
    return weight;

}

}

但是901会比较不同,它是针对当天的,所以并不知道整个数组,只能知道前面的,所以并不是从左往右,但是它还是能用递归栈,也就是说还有这种思路,再记录一个次数,学习一下,以后遇到知道这种思路就行,不要纠结.如果真的理解不了就直接记住这道题就好,以后也可能只考这道题。

慌乱大可不必!

其实你要说实质,就是递归栈的实质可以一直维持一个递增的栈和递减的栈,思路可以从这打开

一定要记得栈里面存放的只是 数组的下标,而不是数,这点很重要!!!


刚重刷了一遍 901 股票价格的问题,其实它原本挺难看懂是递归栈的。

不过也有递归栈的几个特点吧。

就是找离自己最近的比自己大或小的数。而股票价格其实也差不多啦,只不过它并不是简单的for循环,而是每天判断,所以如果栈顶有变化,也就是说大数把小数踢出去,那么新入栈的数必须得保存一下被踢出去的信息,也就是在它前面原本还有几个比它小的。

因为后面进来的数,它只看到栈顶,但是并不能知道栈顶发生了什么变化,所以需要多一个栈来保存信息,这就是用一个递归栈加一个普通栈解决问题的案例。

这道题如何不是每天判断,而是for循环,还可以从右到左进行一个简单的递归栈操作。但是还是要因题而异啦。

每个题都不要想当然,做题做到最好重要的是看区别!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值