环数组的最大子数组的和
一、题目要求
题目:返回一个整数数组中最大子数组的和。
要求:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大。
同时返回最大子数组的位置。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
二、设计思想
把数组每一位向后移动一位,最后一位放在第一位。循环多次,每次求其最大子数组,存放到新数组内,比较新数组中最大数,并输出。
三、源代码
#include <iostream.h> int Largest(int list[],int length) { int n,max=list[0];/ for(n=0;n<=(length-1);n++) { if(list[n]>max) { max=list[n]; } } return max; } int MaxSum2(int *A, int n) { int nStart = A[n-1]; int nAll = A[n-1]; for(int i = n-2;i>=0;--i) { if(nStart<0) nStart = 0; nStart += A[i]; if(nStart>=nAll) { nAll = nStart; } } return nAll; } int main(void) { int sum[5]={1,-2,-3,-4,5}; int sum2[15]={0}; int gg[5]={0}; int kk[5]={0}; int t; for(int k=0;k<5;k++) { t=sum[4]; for(int j=3;j>=0;j--) {sum[j+1]=sum[j];} sum[0]=t; gg[k]=MaxSum2(sum,5); } cout<<Largest(gg,5)<<endl; }
四、结果截图
五、心得体会
一个人意识不到的问题,另一个人如果是互补的,就会让问题很快的解决。
凌晨00:08,睡觉去~~~