我的库存跨度问题算法怎么不正确?

问题描述 投票:0回答:1

问题:

股票跨度问题是一个财务问题,我们有一系列股票的 n 个每日报价,我们需要计算所有 n 天的股票价格跨度。 某一天 i 股票价格的跨度 Si 定义为该日之前该股票价格小于或等于当天价格的最大连续天数。 例如,如果 7 天的价格数组指定为 {100, 80, 60, 70, 60, 75, 85},则相应 7 天的跨度值为 {1, 1, 1, 2, 1, 4 , 6}.

我的解决方案:

class Solution {
    
    public static int[] calculateSpan(int price[], int n) {
        Stack<Integer> s1 = new Stack<>();
        Stack<Integer> s2 = new Stack<>();
        int[] count = new int[price.length];
        
        for(int i = 0 ; i < n; i++) {
            int size = 0;
            
            while(!s1.empty() && price[i] > s1.peek()) {
                s2.push(s1.pop());
            }
            if(!s2.empty()) {
                size = s2.size();
            }
            while(!s2.empty() && price[i] > s2.peek()) {
                s1.push(s2.pop());
            }
            
            s1.push(price[i]);
            count[i] = size + 1;
        }
        
        return count;
    }
}

输入:

n = 134
74 665 742 512 254 469 748 445 663 758 38 60 724 142 330 779 317 636 591 243 289 507 241 143 65 249 247 606 691 330 371 151 607 702 394 349 430 624 85 755 357 641 167 177 332 709 145 440 627 124 738 739 119 483 530 542 34 716 640 59 305 331 378 707 474 787 222 746 525 673 671 230 378 374 298 513 787 491 362 237 756 768 456 375 32 53 151 351 142 125 367 231 708 592 408 138 258 288 554 784 546 110 210 159 222 189 23 147 307 231 414 369 101 592 363 56 611 760 425 538 749 84 396 42 403 351 692 437 575 621 597 22 149 800

我的输出是:

1 2 3 1 1 2 7 1 2 10 1 2 3 1 2 16 1 2 1 1 2 3 1 1 1 4 1 10 13 1 2 1 4 18 1 1 3 4 1 24 1 2 1 2 3 6 1 2 3 1 11 12 1 2 3 4 1 6 1 1 2 3 4 6 1 66 1 2 1 2 1 1 2 1 1 5 11 1 1 1 4 5 1 1 1 2 3 4 1 1 7 1 11 1 1 1 2 3 5 23 1 1 2 1 4 1 1 2 8 1 10 1 1 14 1 1 17 18 1 2 3 1 2 1 4 1 6 1 2 3 1 1 2 134

而预期输出是:

1 2 3 1 1 2 7 1 2 10 1 2 3 1 2 16 1 2 1 1 2 3 1 1 1 4 1 10 13 1 2 1 4 18 1 1 3 4 1 24 1 2 1 2 3 6 1 2 3 1 11 12 1 2 3 4 1 6 1 1 2 3 4 6 1 66 1 2 1 2 1 1 2 1 1 5 77 1 1 1 4 5 1 1 1 2 3 4 1 1 7 1 11 1 1 1 2 3 5 23 1 1 2 1 4 1 1 2 8 1 10 1 1 14 1 1 17 18 1 2 3 1 2 1 4 1 6 1 2 3 1 1 2 134

区别在于输出中的一个值是 77,而我的是 11。

过去 5 个小时我一直在调试这个,但无法理解。 非常感谢您帮助理解这个问题。

旁注:我知道我们可以使用 1 个堆栈和各种其他优化方法来做到这一点。但我只是想知道我的方法哪里不正确?我的算法有什么问题吗?

java algorithm data-structures stack
1个回答
-1
投票
public static int[] calculateSpan(int price[], int n) {
    Stack<Integer> stack = new Stack<>();
    int[] span = new int[n];
    
    for (int i = 0; i < n; i++) {
        while (!stack.isEmpty() && price[i] >= price[stack.peek()]) {
            stack.pop();
        }
        span[i] = stack.isEmpty() ? i + 1 : i - stack.peek();
        stack.push(i);
    }
    
    return span;
}
© www.soinside.com 2019 - 2024. All rights reserved.