问题描述: 给定一个数组,求出从某个数字开始,依次向后加N个数,这些数之和为整个数组中最大的
例:{-1,2,3,-3,5,-2} 求得结果为 2 加到 5。
思路: 从第一个数字开始,依次向后加,当和为负数时,剪掉前面的所有数字。(前面这些的和都是负的了,加到后面只会使值变小- -)当和为正数并大于以前的所得的和时,记录此时最左边与最右边的位置,再继续向后加,直至加到最后一个数。
总结: 此方法只需遍历数组一次,就可求得最大值与求得最大值的方法(开始的数.位置 结束的数.位置)
int sum = 0;
int left = 0;
int maxleft = 0;\\这个是最终结果,上边的那个是临使需要的,用来保存剪掉负数和之后的开始位置 int right = 0;
int max = 0;
int i = 0;
int a[] = {-100,1,3,-100,5,4,6,-100};
for(i = 0;i < sizeof(a)/sizeof(a[0]);i++)
{
sum = sum + a[i];
if ( sum < 0 )
{
left = i + 1;
sum = 0;
}
if( sum > max )
{
max = sum;
right = i;
maxleft = left;
}
}
printf("letf = %d,right = %d",maxleft,right);\\此处输出的为数组下标