LeetCode第121题买卖股票的最佳时机编译后出现runtime error如何解决
报错原因分析
- 核心触发点:你在判断
profit数组是否为空之前,就执行了vector<int>::iterator it = profit.end()-1;操作。当输入的股价数组严格递减、或者长度小于2时,profit数组不会插入任何元素,处于空状态。空vector的end()迭代器做偏移操作属于非法未定义行为,报错信息里的超大偏移量18446744073709551612就是无符号类型下-4的转码结果,直接触发了运行时检查。 - 潜在风险:循环判断条件
i<prices.size()-1存在无符号溢出问题。prices.size()是无符号类型size_t,如果输入空的股价数组,prices.size()-1会溢出为size_t的最大值,导致循环进入后非法访问数组。
修复方案
- 直接删除冗余的
vector<int>::iterator it = profit.end()-1;行,你后续逻辑完全没有用到这个迭代器变量,删掉即可解决核心运行错误。 - 在函数开头增加边界判断,避免无符号溢出和无意义的循环执行,修复后的代码如下:
class Solution { public: int maxProfit(vector<int>& prices) { // 长度小于2不可能产生利润,直接返回 if (prices.size() < 2) return 0; vector<int> profit; int buy,num; for(int i=0; i<prices.size()-1; i++) { buy = prices[i]; for(int j=i+1; j<prices.size(); j++) { if(buy < prices[j]) profit.push_back(prices[j]-buy); } } if(!profit.empty()) { sort(profit.begin(), profit.end()); num = *(profit.end()-1); return num ; } else { return 0; } } };
优化提示
当前暴力枚举的时间复杂度是O(n²),在LeetCode提交会因为大测试用例超时。可以改用一次遍历法:遍历过程中记录当前的最小买入价,同时计算当前卖出的利润,同步更新最大利润即可,时间复杂度为O(n),空间复杂度为O(1)。
内容的提问来源于stack exchange,提问作者Tanvi
相关产品推荐
相关产品推荐

