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
相关产品推荐
相关产品推荐

