求数组中和最大的子数组并输出子数组序列
2017-09-05 15:48
225 查看
输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。输出和最大的子数组。要求时间复杂度为O(n)。
例如输入的数组为A={0,-6,3,5,-1,2},和最大的子数组为{3,5,-1,2},因此输出为该子数组的和9。
将数组分为三个部分:i之前,i,i之后;
i之后是待确定的子数组;
i之前是已经确定的子数组;
i是待加入的元素;
nStart表示包含A[i]的和最大的子数组;
nAll表示不包含A[i]的和最大的子数组;
如果nStart<0,抛弃前面的子数组(该子数组不是和最大的子数组),从i+1的位置开始寻找子数组;
如果nStart > nAll ,A[i]加入子数组;
int MaxSum(int *A, int n)
{
assert(A && n > 0);
int nStart = A[0];
int nAll = A[0];
int begin = 0;
int end = 0;
for (int i = 0; i <= n - 1; i++)
{
/*
0,-6 抛弃,重新寻找
3,5,-1,2
*/
if (nStart < 0)
{
begin = i;
nStart = 0;
}
nStart += A[i];
if (nStart > nAll)
{
end = i;
nAll = nStart;
}
}
if (nAll >= 0)
{
for (int i = begin; i <= end; i++)
{
cout << A[i] << " ";
}
cout << endl;
return nAll;
}
else
{
cout << nAll << endl;
return nAll;
}
}
void Test()
{
int a[] = { 0, -6, 3, 5, -1, 2 };
//int a[] = { -5, -1, -3, -5, -1, -2 };
cout << MaxSum(a, sizeof(a) / sizeof(a[0])) << endl;
}
例如输入的数组为A={0,-6,3,5,-1,2},和最大的子数组为{3,5,-1,2},因此输出为该子数组的和9。
将数组分为三个部分:i之前,i,i之后;
i之后是待确定的子数组;
i之前是已经确定的子数组;
i是待加入的元素;
nStart表示包含A[i]的和最大的子数组;
nAll表示不包含A[i]的和最大的子数组;
如果nStart<0,抛弃前面的子数组(该子数组不是和最大的子数组),从i+1的位置开始寻找子数组;
如果nStart > nAll ,A[i]加入子数组;
int MaxSum(int *A, int n)
{
assert(A && n > 0);
int nStart = A[0];
int nAll = A[0];
int begin = 0;
int end = 0;
for (int i = 0; i <= n - 1; i++)
{
/*
0,-6 抛弃,重新寻找
3,5,-1,2
*/
if (nStart < 0)
{
begin = i;
nStart = 0;
}
nStart += A[i];
if (nStart > nAll)
{
end = i;
nAll = nStart;
}
}
if (nAll >= 0)
{
for (int i = begin; i <= end; i++)
{
cout << A[i] << " ";
}
cout << endl;
return nAll;
}
else
{
cout << nAll << endl;
return nAll;
}
}
void Test()
{
int a[] = { 0, -6, 3, 5, -1, 2 };
//int a[] = { -5, -1, -3, -5, -1, -2 };
cout << MaxSum(a, sizeof(a) / sizeof(a[0])) << endl;
}
相关文章推荐
- 求数组中和最大子序列
- 取数组中和最大的一段连续序列
- 关于如何查找数组中和最大的子序列
- 求数组中和最大的子序列
- 求出int数组中和最大的子序列
- 求数组中和最大的子序列
- 寻找数组中和最大的子序列
- 如何查找数组中和最大的子序列
- 数组中和最大的递增子序列
- C#求数组中和最大的连续子数组
- [珠玑之椟]字符串和序列:左移、哈希、最长重复子序列的后缀数组解法、最大连续子序列
- 实组的最大子数组和最大公共子序列
- 1.将数组A中的内容和数组B中的内容进行交换。(数组一样大) 2.获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列。 3.将三个数按从大到小输出。 4.求两个数的最大公约数。
- 求一个整数数组中和最大的连续子数组,例如:[1, 2, -4, 4, 10, -3, 4, -5, 1]的最大连续子数组是[4, 10, -3, 4](需写明思路,并编程实现)
- 数组最大子序列和
- IT公司100题-3-求数组的最大子序列的和
- 数组最大子序列和
- 输入整形数组,数组里有正数也有负数,数组中一个或连续的多个整数组成数组的子数组,求所有子数组中和的最大值 ,例如输入的数组为{1,-2,3,10,-4,7,2,-5}和最大的子数组为{3,10,
- 数组连续子序列的最大的和;四种算法,四种时间复杂度
- 最长公共子序列|最长公共子串|最长重复子串|最长不重复子串|最长回文子串|最长递增子序列|最大子数组和