返回一个整数数组中最大子数组的和3
题目:返回一个整数数组中最大子数组的和3
要求:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
如果数组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;
}
截图:
总结:刚开始用的是课堂上说的那种方法,但是还是没有做出来还是在网上找的例子