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

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的最大值,导致循环进入后非法访问数组。
修复方案
  1. 直接删除冗余的vector<int>::iterator it = profit.end()-1;行,你后续逻辑完全没有用到这个迭代器变量,删掉即可解决核心运行错误。
  2. 在函数开头增加边界判断,避免无符号溢出和无意义的循环执行,修复后的代码如下:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 20:18:02