You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LeetCode 121买卖股票问题:maxP初始化报错原因咨询

为什么初始化maxP为data_in[s_point_ind]-data_in[b_point_ind]会导致LeetCode运行错误?

问题概述

我针对LeetCode 121「买卖股票的最佳时机」写的代码,在Spyder/Jupyter Notebook里用测试用例[7,1,5,3,6,4]运行完全正常,但提交到LeetCode控制台时触发了运行时错误。把maxP的初始值从data_in[s_point_ind]-data_in[b_point_ind]改成0后就能通过所有测试,想搞清楚背后的原因。

原报错代码

class Solution(object):
    def maxProfit(self, data_in:list[int]) -> int:
        b_point_ind = 0
        s_point_ind = 1 
        
        maxP = data_in[s_point_ind]-data_in[b_point_ind]
            
        while s_point_ind <= (len(data_in)-1):
            # 盈利情况
            if data_in[b_point_ind] <= data_in[s_point_ind]:
                maxP = max(maxP, (data_in[s_point_ind]-data_in[b_point_ind]))
                s_point_ind +=1 
            # 非盈利情况
            else: 
                b_point_ind = s_point_ind
                s_point_ind +=1 
            
        maxP = max(0,maxP)
        return maxP

prices = [7,1,5,3,6,4]
stock_buy = Solution()
profit = stock_buy.maxProfit(prices)

修改后可通过代码

class Solution(object):
    def maxProfit(self, data_in:list[int]) -> int:
        b_point_ind = 0
        s_point_ind = 1 
        
        maxP = 0
            
        while s_point_ind <= (len(data_in)-1):
            # 盈利情况
            if data_in[b_point_ind] <= data_in[s_point_ind]:
                maxP = max(maxP, (data_in[s_point_ind]-data_in[b_point_ind]))
                s_point_ind +=1 
            # 非盈利情况
            else: 
                b_point_ind = s_point_ind
                s_point_ind +=1 
            
        maxP = max(0,maxP)
        return maxP

prices = [7,1,5,3,6,4]
stock_buy = Solution()
profit = stock_buy.maxProfit(prices)

错误根源

1. LeetCode的边界测试用例触发索引越界

LeetCode的测试用例会覆盖边界场景,比如输入数组长度为1的情况(题目规定数组长度范围是1 <= prices.length <= 10^5)。当输入数组长度为1时:

  • s_point_ind初始值是1,而数组的最大索引是len(data_in)-1 = 0
  • 这时候执行maxP = data_in[s_point_ind]-data_in[b_point_ind],相当于访问data_in[1],但数组只有索引0的元素,直接触发索引越界错误。

而你本地测试用的是长度为6的数组,不会碰到这个场景,所以运行正常。

2. 初始化maxP=0为什么能解决问题?

当输入数组长度为1时:

  • 循环条件s_point_ind <= len(data_in)-1即1 <= 0不成立,循环完全不会执行
  • 最后执行maxP = max(0, 0),返回0,符合题目要求(无法买卖时利润为0)

对于正常长度的数组,初始化0也不影响逻辑:因为后续循环会不断用max()更新maxP为实际的最大利润,最后再和0取最大值,保证不会返回负数利润。

补充信息

题目原文翻译(LeetCode 121)

给定一个数组prices,它的第i个元素prices[i]表示一支给定股票第i天的价格。你只能选择某一天买入这只股票,并选择在未来的某一个不同的日子卖出该股票。设计一个算法来计算你所能获取的最大利润。如果你不能获取任何利润,返回0。

报错信息翻译

触发索引越界错误:列表索引超出范围,原因是访问了数组中不存在的索引位置。

内容的提问来源于stack exchange,提问作者Dummy1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 14:30:49