寻找长度为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;}
错误分析
未初始化变量导致的未定义行为
ans1未初始化,当i-k < 0时(即子数组无法从有效起始位置开始),不会执行赋值操作,此时ans1是内存中的垃圾值。执行ans = max(ans, ans1)会将垃圾值纳入比较,直接污染最终结果。循环范围错误,包含无效索引
长度为K的连续子数组,其结束索引的有效范围应为k-1 ≤ i < n(对应子数组起始索引为i-k+1)。原代码循环从n-1遍历到0,包含了i < k的无效情况,这些情况无法计算有效子数组和,却仍参与了ans的更新。前缀和边界处理缺失
原前缀和数组从第一个元素开始累加,导致需要单独处理k=n的特殊情况,且无法统一计算从数组开头起始的子数组和(如前K个元素的和),增加了出错概率。输入优化代码错误
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
相关产品推荐
相关产品推荐

