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

寻找长度为K的最大和正整数子数组:代码报错求助

连续K长子数组最大和问题的代码错误分析

问题背景

给定由N个正整数组成的数组,需选取长度为K的连续子数组,找出其中和最大的子数组的和。

  • 输入格式:第一行输入N和K,第二行输入N个整数Ai
  • 输出格式:最大子数组的和
  • 约束:1≤K≤N≤1000,1≤Ai≤1000

错误代码

#include<iostream>
using namespace std;
int main(){
    ios_base::sync_with_stdio(NULL);
    cin.tie(NULL);
    int n,k;
    cin>>n>>k;
    int a,s[n],sum=0,ans=0,ans1;
    for(int i=0; i<n; i++){
        cin>>a;
        sum+=a; 
        s[i]=sum;
    }
    if(k==n){
      cout<<sum<<endl;
      return 0;
    }
    for(int i=n-1; i>=0; i--){
       if(i-k>=0){
         ans1=s[i]-s[i-k];
       }
         ans=max(ans,ans1);
    }
    cout<<ans<<endl;
    return 0;}

错误分析

  1. 未初始化变量导致的未定义行为
    ans1未初始化,当i-k < 0时(即子数组无法从有效起始位置开始),不会执行赋值操作,此时ans1是内存中的垃圾值。执行ans = max(ans, ans1)会将垃圾值纳入比较,直接污染最终结果。

  2. 循环范围错误,包含无效索引
    长度为K的连续子数组,其结束索引的有效范围应为k-1 ≤ i < n(对应子数组起始索引为i-k+1)。原代码循环从n-1遍历到0,包含了i < k的无效情况,这些情况无法计算有效子数组和,却仍参与了ans的更新。

  3. 前缀和边界处理缺失
    原前缀和数组从第一个元素开始累加,导致需要单独处理k=n的特殊情况,且无法统一计算从数组开头起始的子数组和(如前K个元素的和),增加了出错概率。

  4. 输入优化代码错误
    ios_base::sync_with_stdio(NULL)写法错误,正确参数应为布尔值false,原写法可能导致输入效率问题或未达到预期优化效果。

修正后的代码

#include<iostream>
#include<algorithm>
using namespace std;
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int n,k;
    cin>>n>>k;
    int a;
    int s[1001]; // 利用约束n≤1000,避免非标准变长数组
    s[0] = 0; // 前缀和初始值,前0个元素和为0
    for(int i=1; i<=n; i++){
        cin>>a;
        s[i] = s[i-1] + a;
    }
    int ans = 0;
    // 遍历所有长度为K的子数组
    for(int i=k; i<=n; i++){
        int current_sum = s[i] - s[i-k];
        ans = max(ans, current_sum);
    }
    cout<<ans<<endl;
    return 0;
}

修正说明

  • 前缀和数组增加s[0]=0,统一所有子数组的和计算方式,无需单独处理k=n的情况。
  • 调整循环范围为i从k到n,确保每个循环都计算有效子数组的和。
  • 每次循环都初始化current_sum,避免未定义行为。
  • 修正输入优化代码,确保同步关闭生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 19:37:47