对于一个具有 n 个元素的整型数组 a,求具有最大连续和的子数组(最少具有一个元素)。
【输入形式】
输入的第一行为一个整数 n ,接下来的一行为 n 个整数,表示数组的元素。
【输出形式】
输出具有最大连续和的子数组的起始编号和结束编号(数组编号为0~n-1)。(使得编号长度最小)
【样例输入】
8 3 -5 1 5 -4 12 0 -1
【样例输出】
2 5
#include <iostream>
using namespace std;
void getMaxSum(int a[], int n, int &Left, int &Right);//函数声明
int main() {
int n;
cin>>n;
int *p=new int[n];//创建动态数组
for(int i=0; i<n; i++)
cin>>p[i];//输入每个元素
int Left, Right;//申请变量,用于储存最终的起始编号和终止编号
getMaxSum(p,n ,Left, Right);//使用getMaxSum函数
cout<<Left<<" "<<Right<<endl;//输出左右元素下标
delete[] p;//释放动态数组
return 0;
}
void getMaxSum(int a[], int n, int &Left, int &Right) {
static int max=0,maxl=0,maxr=0;//申请静态全局变量 max,maxl,maxr(maxl的对应位置及maxr的对应位置
for(int i=0; i<n; i++) { //第一层循环,i从左到右,每次数组长度从左边减1
for(int j=n-1; j>=i; j--) { //第二层循环,在第一层循环的基础上,j从右到左,每次数组长度从右边减1
int all=0; //申请all,用于记录连续和
for(int m=i; m<=j; m++) {
all+=a[m];//第三层循环, 得到每次的连续和
}
if(all>max) {
max=all;//在第二层中判断,如果有更大的连续和,则将all的值(即最大和)赋给max
maxl=i;//将该数组左位置坐标赋给maxl
maxr=j;// 将该数组右位置坐标赋给maxr
while(a[j]==0) {
maxr--;
j--;//如果最大连续和最后一个元素为0,则右位置左移一个单位 ,直到最后一个元素不为0停止
}
}
}
}
Left=maxl;//将具有最大连续和数组的左位置赋给变量Left,右位置赋给变量Right,便于输出
Right=maxr;
}
该题并不复杂,需要分清每次循环所要判定的东西以及执行的内容。并且考虑使具有相同最大连续和的数组的长度最小,用while循环实现。
相信这道题能给你带来启发,如果有更好的方法,欢迎大家在评论区交流。