問題描述:
問題:一個整數數組中的元素有正有負,在該數組中找出一個連續子數組,要求該連續子數組中各元素的和最大,這個連續子數組便被稱作最大連續子數組。比如數組{2,4,-7,5,2,-1,2,-4,3}的最大連續子數組為{5,2,-1,2},最大連續子數組的和為+-+=。
解問題:
一、暴力解法:
#include<iostream>
using namespace std;
class solution
{
public:
int FIND_MAXMUM_SUBARRAY(int A[], int length)
{
int i, j;
int sum = ;
for (i = ; i < length; i++)
{
int cursum = ;
for (int j = i; j < length; j++)
{
cursum += A[j];
if (cursum > sum)
{
sum = cursum;
}
}
}
return sum;
}
};
int main()
{
int A[] = { -,,-,,,,,-,- };
solution S1;
cout << S1.FIND_MAXMUM_SUBARRAY(A, );
system("pause");
}
二、分治解法:
#include<iostream>
using namespace std;
class solution
{
public:
int FIND_MAXMUM_SUBARRAY(int A[],int low,int high)
{
if (low == high)
return A[low];
else
{
int mid = (low + high) / ;
int leftmax, rightmax, crossmax;
leftmax = FIND_MAXMUM_SUBARRAY(A, low, mid);
rightmax = FIND_MAXMUM_SUBARRAY(A, mid + , high);
crossmax = findcross(A, low, high);
if (leftmax >= rightmax&&leftmax >= crossmax)
{
return leftmax;
}
else if (rightmax >= leftmax&&rightmax >= crossmax)
{
return rightmax;
}
else
return crossmax;
}
}
int findcross(int A[],int low,int high)
{
int left_sum = -;
int sum = ;
int right_sum = -;
int mid = (low + high) / ;
for (int i = mid; i>=; i--)
{
sum += A[i];
if (sum > left_sum)
{
left_sum = sum;
}
}
sum = ;
for (int i = mid + ; i <=high; i++)
{
sum = sum + A[i];
if (sum > right_sum)
{
right_sum = sum;
}
}
return left_sum + right_sum;
}
};
int main()
{
int A[] = { -,,-,,,,,-,- };
solution S1;
cout<<S1.FIND_MAXMUM_SUBARRAY(A, ,);
system("pause");
}
三 、線性解法:
#include<iostream>
/*
@author zsj
*/
using namespace std;
int find(int a[], int length)
{
int temp=;
int max=;
for (int i = ; i < length; i++)
{
temp += a[i];
if (temp > max)
max = temp;
if (temp < )
temp = ;
}
}