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

最大子数组和代码逻辑无误却输出异常,求问题排查

问题根源:无符号整数类型转换导致循环未执行

你的代码输出-2147483648(即INT_MIN)的核心原因是有符号整数与无符号整数的隐式转换,导致循环体一次都没运行,maxsum始终保持初始值。

具体分析:

  • nums.size()返回的是size_t类型(无符号整数),而你的循环变量i是int类型(有符号)。在比较i++ < nums.size()时,C++会将i隐式转换为size_t类型。
  • 初始时i=-1,转换为size_t后会变成该类型的最大值(比如32位系统下是4294967295),这个值远大于nums.size()(此处为9),因此循环条件直接不成立,循环体从未执行。
  • 此时maxsum一直是初始的INT_MIN,函数自然返回这个错误值。

修复方案

以下几种方式都可以解决问题,推荐使用更简洁直观的写法:

方案1:使用范围for循环(最简洁)

直接遍历数组元素,完全避免索引类型问题:

#include<bits/stdc++.h>
using namespace std;

int maxSubArray(vector<int> nums) {
    int sum = 0;
    int maxsum = INT_MIN;
    for (int num : nums) {
        sum += num;
        maxsum = max(sum, maxsum);
        if (sum < 0) sum = 0;
    }
    return maxsum;
}

int main() {
    vector<int> arr{-2,1,-3,4,-1,2,1,-5,4};
    cout << maxSubArray(arr);
    return 0;
}

方案2:将循环变量改为size_t类型

匹配nums.size()的类型,避免转换问题:

#include<bits/stdc++.h>
using namespace std;

int maxSubArray(vector<int> nums) {
    int sum = 0;
    int maxsum = INT_MIN;
    size_t i = 0;
    while (i < nums.size()) {           
        sum += nums[i];
        maxsum = max(sum, maxsum);
        if (sum < 0) sum = 0;
        i++;
    }
    return maxsum;
}

int main() {
    vector<int> arr{-2,1,-3,4,-1,2,1,-5,4};
    cout << maxSubArray(arr);
    return 0;
}

方案3:将nums.size()转为int类型

如果坚持保留原循环结构,先把数组长度转为int类型再使用:

#include<bits/stdc++.h>
using namespace std;

int maxSubArray(vector<int> nums) {
    int sum = 0;
    int maxsum = INT_MIN;
    int i = -1;
    int n = nums.size(); // 转换为int类型
    while (i++ < n) {           
        if (i < n) sum += nums[i];
        maxsum = max(sum, maxsum);
        if (sum < 0) sum = 0;
    }
    return maxsum;
}

int main() {
    vector<int> arr{-2,1,-3,4,-1,2,1,-5,4};
    cout << maxSubArray(arr);
    return 0;
}

修复后运行测试用例,输出会是预期的6。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 13:07:37