返回一个整数数组中最大子数组的和
要求:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大。
同时返回最大子数组的位置。
求所有子数组的和的最大值。
思路:这次的任务比较上次多了一个环形,所以再利用for循环
源代码:
#include<iostream> #include<time.h> #include <stdio.h> #include <stdlib.h> using namespace std; int max_subarray_bound(int a[],int from,int to) { int i,max,sum; max = a[from]; sum = a[from]; for(i = from + 1;i <= to;i++) { if(sum < 0) sum = 0; sum += a[i]; if(max < sum) max = sum; } return max; } int max_subarray_cycle(int a[],int size) { int sum,i,j,s,m; sum = max_subarray_bound(a,0,size-1); if(size == 2) return sum; i = 1; j = size-2; s = a[i-1] + a[j+1]; while(i < j && (a[i] >=0 || a[j] >= 0)) { if(a[i] >= 0) { s += a[i]; i++; } if(a[j] >= 0) { s += a[j]; j--; } } if(i == j) { if(a[i] >0) s+=a[i]; if(s < sum) return sum; else return s; } if(i < j) { int s2,k; m = a[i]; s2 = m; for(k=i+1;k <= j;k++) { s2 += a[k]; if(m < s2) m = s2; } s2 = a[j]; for(k = j-1;k>=i;k--) { s2 += a[j]; if(m < s2) m = s2; } if(m > 0) s += m; } if(s < sum) return sum; else return s; } int main(int argc,char *argv[]) { int num,*a; cout<<"请输入以为数组的长度:"; cin>>num; a = new int [num]; srand((unsigned)time(NULL)); for(int i=0;i<num;i++) { a[i]=rand()%100-25; cout<<a[i]<<" "; } cout<<endl; cout<<"环形一维数组子数组和的最大值: "<<max_subarray_cycle(a,num)<<endl; delete a; return 0; }
结果