题目链接:https://www.patest.cn/contests/pat-a-practise/1007
题目大意:求一个数列的最大子列和,并输出该子列的起点和终点元素
解题思路:
- 最大和maxsum和临时和curSum初始化为0。临时和变大时更新maxsum,临时和小于0的时候,将其更新为0。
- end的更新比较好理解,end在cursum>maxsum的条件下随着i一直递增
- start的更新稍微复杂一点,start位置的前一个cursum<0,并且start处cursum>maxsum。
- 不要忘记处理边界情况:全为负数的时候。
代码如下:
#include <iostream>
using namespace std;
int main(int argc, char const *argv[])
{
int maxSum=-1,curSum=0,start=0,tmpstart=0,end=-1,n;
cin>>n;
int A[n];
for(int i=0;i<n;i++)
cin>>A[i];
for(int i=0;i<n;i++){
curSum+=A[i];
if(curSum>maxSum){//临时最大值变大
maxSum=curSum;//更新最大值
end=i;//更新结尾下标
start=tmpstart;//更新开始下标
}
if(curSum<0){//临时和为负
curSum=0;//将其置0
tmpstart=i+1;//开始下标前移
}
}
if(end==-1)//全都为负数
cout<<"0 "<<A[0]<<" "<<A[n-1]<<endl;
else
cout<<maxSum<<" "<<A[start]<<" "<<A[end]<<endl;
return 0;
}