LC 901. 股票价格跨度 LC 739. 每日温度

1、LC 901. 股票价格跨度

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

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

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

示例:

输入:[“StockSpanner”,“next”,“next”,“next”,“next”,“next”,“next”,“next”], [[],[100],[80],[60],[70],[60],[75],[85]]
输出:[null,1,1,1,2,1,4,6]
解释:
首先,初始化 S = StockSpanner(),然后:
S.next(100) 被调用并返回 1,
S.next(80) 被调用并返回 1,
S.next(60) 被调用并返回 1,
S.next(70) 被调用并返回 2,
S.next(60) 被调用并返回 1,
S.next(75) 被调用并返回 4,
S.next(85) 被调用并返回 6。

注意 (例如) S.next(75) 返回 4,因为截至今天的最后 4 个价格
(包括今天的价格 75) 小于或等于今天的价格。

提示:

  1. 调用 StockSpanner.next(int price) 时,将有 1 <= price <= 10^5。
  2. 每个测试用例最多可以调用 10000 次 StockSpanner.next。
  3. 在所有测试用例中,最多调用 150000 次 StockSpanner.next。
  4. 此问题的总时间限制减少了 50%。
import java.util.*;

class StockSpanner {

    public StockSpanner() {
        
    }
    
    Stack<int[]> stack=new Stack<>();

    public int next(int price) {
        int res=1;
        while (!stack.isEmpty()&&stack.peek()[0]<=price){
            res+=stack.pop()[1];
        }
        stack.push(new int[]{price,res});
        return res;
    }
    
    public int[] getRes(int[] arr){
        int[] dp=new int[arr.length];
        return dp;
    } 
}

2、LC 739. 每日温度

根据每日 气温 列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高的天数。如果之后都不会升高,请输入 0 来代替。

例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。

提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的都是 [30, 100] 范围内的整数。

思路1:

//739. 每日温度
    public int[] dailyTemperatures1(int[] T) {
        int[] t=T;
        int[] res=new int[T.length];
        for(int i=0;i<t.length;i++){
            int j=i+1;
            while (j<t.length&&t[j]<=t[i]){
                j++;
            }
            if(j==t.length){
                res[i]=0;
            }else{
                res[i]=j-i;
            }
        }
        return res;
    }

思路2:

   //思路2:别人的
    public int[] dailyTemperatures(int[] T) {
        int[] t=T;
        int[] res=new int[t.length];

        Stack<Integer> stack=new Stack<>();
        for(int i=0;i<t.length;i++){
            while (!stack.isEmpty()&&t[i]>t[stack.peek()]){
                int index=stack.pop();
                res[index]=i-index;
            }
            stack.push(i);
        }
        return res;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值