连续子数组的最大和
来源:互联网 发布:中国企业海外投资数据 编辑:程序博客网 时间:2024/05/29 09:30
题目描述
输入一个整型数组,数组里有正数也有负数,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
输入描述
输入第一行一个整数序列的序列长度,如:8
输入第二行为整数序列,数字用空格分隔,如:1 -2 3 10 -4 7 2 -5
输出描述
上述最大子数组为{3,1,-4,7,2},因此输出为18
分析
方法1:枚举所有子数组并求和。 先从第一个数字开始找到最大的子数组的和,再从第二个数开始找到子数组的和,并找到最大的数,第二个数开始的最大数和第一个开始的最大数比,保留其中较大的,然后从第三个数开始找到最大的子数组的和,重复上述过程,直到找到最大的连续子数组的最大和。
备注:该方法效率会比较低
方法2:采用一个for循环,定义局部变量sum和全局变量max,如果子数组加上后一个数后大于等于后一个数时,那么sum变为sum加上后一个数,否则sum变为后一个数。然后判断sum是否大于max,如果大于max,那么用sum覆盖max,否则max保持不变。
代码方法1
#include<stdio.h>
int main()
{
int i,j,k,n,max,sum;
scanf("%d",&n);
int x[n];
for(i=0;i<n;i++)//输入序列x
scanf("%d",&x[i]);
for(i=0;i<n;i++)//找出子序列
{
sum=0;
//注意这里sum=0的作用,即将sum初始化,重新从0开始求和。
for(j=i;j<n;j++)
{
sum+=x[j];//求和
if(max<sum) max=sum;
}
}
printf("最大和=%d\n",max);
return 0;
}
代码方法2
#include<stdio.h>
int main()
{
int sum=0,max=0;
int n,i;
scanf("%d",&n);
int a[n];
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n;i++)
{
if(sum+a[i]>=a[i])
sum+=a[i];
else
sum=a[i];
if(sum>max)
max=sum;
}
printf("%d",max);
return 0;
}
- 数组连续子数组的和最大
- 数组连续子数组的最大和
- 连续子数组的最大和
- 连续子数组的最大和
- 连续子数组的最大和
- 求连续子数组的最大和
- 连续子数组的最大和
- 求连续子数组的最大和
- 求连续子数组的最大和
- 连续子数组的最大和
- 连续子数组的最大和
- (8)连续子数组的最大和
- 求连续子数组的最大和
- 求连续子数组的最大和
- 连续子数组的最大和
- 求连续子数组的最大和
- 连续子数组的最大和
- 连续子数组的最大和
- [Struts2] Action类
- 再次认识Java中构造器的初始化与继承
- 命名管道用于并行执行
- opencv3.3+opencv_contrib+vs2013编译
- 2017.9.7 模拟考试
- 连续子数组的最大和
- C#中DataGridView使用
- 听老谢一席话,胜喝一吨鸡汤:)
- ES6-let 与 const
- 实战c++中的string系列--string与整型或浮点型互转
- [Struts2] Struts中OGNL
- css3 box-sizing属性
- 百度语音合成快速集成
- [Struts2] URL、URI以及ServletPath之间的区别