栈的应用——股票价格跨度

题意:

  • 编写一个 StockSpanner 类,它收集某些股票的每日报价,并返回该股票当日价格的跨度。
  • 今天股票价格的跨度被定义为股票价格小于或等于今天价格的最大连续日数(从今天开始往回数,包括今天)。
  • 例如,如果未来7天股票的价格是 [100, 80, 60, 70, 60, 75, 85],那么股票跨度将是 [1, 1, 1, 2, 1, 4, 6]。

题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/online-stock-span

思路:
使用一个栈来记录股票价小于等于今天股票价格的天数(包括今天)days;
要先清楚:当新的一天today的price小于等于前一天yesterday时,意味着today的days就是yesterday的days+today.days(todays.days=1,因为满足等于),
再与yesterday的前一天的price比较;
如果还是小于就加上它的days。

Stack price;
Stack days;

while(today.price>yesterday.price&&!price.empty ()){
      today.days=today.days+yesterday.days; 
      price.pop( );
      days.pop() ;
}

//再将新的一天的price和days入栈
price.push(today.price);
days.push(today.days);

如果today.price小于之前的一天,则根本不用与再前些天作比较。到此就已经结束。today.days=1;
否则,today.price>=yesterday.price,那今天价格也肯定大于yesterday.days中那些小于yesterday.price 的日子。这样yesterday.price就不需要存在了,today.price继续与之前的日子价格比较,还是分两种情况;
最后将today.price和today.days分别进栈,之前因为更新today的数据而删除的数据不会影响将来一天的价格跨度,因为today.days已经是小于等于today.price的所有连续天数;

days中记录的就是具体一天的股票价格跨度。(相当于连续区间的长度),这个区间记录的天数是满足小于这一天价格的天数。


class StockSpanner {

    Stack<Integer> prices;
    Stack<Integer> days;

    public StockSpanner() {
        prices=new Stack();
        days=new Stack();
    }

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值