[Leetcode学习-java]StockSpanner(股票跨度计算)

本文介绍了一个LeetCode题目——StockSpanner,要求计算股票的跨度,即连续的天数中股票价格小于当前价格的天数。文章讨论了原解法的效率问题,并分享了一个高效的Java解决方案,通过动态规划优化,实测表明构造方法初始化值的效率高于构造器。
摘要由CSDN通过智能技术生成

问题:

难度:easy

说明:

调用时候会实例化一个StockSpanner,然后不断调用StockSpanner.next(int input),从输入参数输入股票价值,然后返回该天的跨度,跨度就是从今天之前的连续的天数,且比今天价值还少的天数数量。

输入案例:

Input: ["StockSpanner","next","next","next","next","next","next","next"], [[],[100],[80],[60],[70],[60],[75],[85]]
Output: [null,1,1,1,2,1,4,6]
Explanation: 
First, S = StockSpanner() is initialized.  Then:
// 第一天100就一天是1
S.next(100) is called and returns 1,
S.next(80) is called and returns 1,
S.next(60) is called and returns 1,
// 70之前还有60所以两天是2
S.next(70) is called and returns 2,
S.next(60) is called and returns 1,
// 75之前有三天比他少是4
S.next(75) is called and returns 4,
S.next(85) is called and returns 6.

Note that (for example) S.next(75) returned 4, because the last 4 prices
(including today's price of 75) were less than or equal to today's price.

输入范围:

输入的股票个数<=10000,整个测试流程会有150000个

我的代码:

是一个动态规划处理。

class StockSpanner {

    int[] priceStack = new int[10000];
    int[] spanStack = new int[10000];
    int top = -1;
    
    public StockSpanner() {
    }
    
    public int next(int price) {
        int span = 1;
        while(top >= 0 && priceStack[top] <= price) span += spanStack[top --];
        top ++;
        priceStack[top] = price;
        spanStack[top] = span;
        return span;
    }
}

这个代码我发现居然效率特别低,然后换了一下。

class StockSpanner {

    int[] priceStack;
    int[] spanStack;
    int top = -1;
    
    // 将数组实例化放到构造方法
    public StockSpanner() {
        priceStack = new int[10000];
        spanStack = new int[10000];
    }
    
    public int next(int price) {
        int span = 1;
        while(top >= 0 && priceStack[top] <= price) span += spanStack[top --];
        top ++;
        priceStack[top] = price;
        spanStack[top] = span;
        return span;
    }
}

然后这个效率奇高。看来java的构造方法初始化值效率特别快比构造器还快,具体原因不明,截图为证。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值