最大连续子数组
问题:
给定一个数组A[0,…,n-1],求A的连续子数组,使得该数组的和最大。
exp:
数组:1,-2,3,10,-4,7,2,-5
最大子数组:3,10,-4,7,2
1 暴力法
时间复杂度为O(n3)
1.1 代码
int MaxSubArray(int *A, int n) //最大连续子数组,参数为数组首地址和数组长度
{
int maxSum = A[0];
int currSum;
for (int i = 0; i < n; i++) //0≤i≤n-1
{
for (int j = i; j < n; j++) //i≤j≤n-1
{
currSum = 0;
for (int k = i; k <= j; k++) //i≤k≤j
{
currSum += A[k];
}
if (currSum > maxSum)
maxSum = currSum;
}
}
return maxSum;
}
1.2 测试代码
int main()
{
int a[] = {
1,-2,3,10,-4,7,2,-5 };
int len = sizeof(a) / sizeof(a[0]);
cout<<MaxSubArray( a, len )<<endl;
//替代system("pause");
cin.clear(); //
cin.sync(); //清空缓存区
cin.get(); //真正接收到键盘输入
return 0;
}
1.3 代码改进
1.3.1 system(“pause”)
对于输出结果一闪而过的问题未作仔细研究,后续会仔细研究如何解决。一般选择使用system("pause");
语句来解决问题。但此方法据大佬说不建议使用,故而选择1.2中语句代替。参考system pause.
1.3.2 输出最大和子数组 vs 最大和
题目要求输出A的最大连续子数组,代码只求出了和。定义两个变量分别对应子数组的第一个和最后一个下标,输出子数组。方法相同,后续不再赘述。代码如下:
#include<iostream>
using namespace std;
int MaxSubArray(int *A, int n) //最大连续子数组,参数为数组首地址和数组长度