最大连续和

对于一个具有 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循环实现。

相信这道题能给你带来启发,如果有更好的方法,欢迎大家在评论区交流。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值