我有一个关于最大子序列算法的快速问题,该算法使用如下所示的分治法:
private static int maxSum3Recursive(int[] a, int left, int right)
{
if (left == right)
{
if (a[left] > 0)
{
return a[left];
}
else {
return 0;
}
}
int center = (left + right) / 2;
int maxLeftSum = maxSum3Recursive(a, left, center);
int maxRightSum = maxSum3Recursive(a, center + 1, right);
int maxLeftBorderSum = 0;
int leftBorderSum = 0;
for (int i = center; i >= left; i--)
{
leftBorderSum += a[i];
if (leftBorderSum > maxLeftBorderSum)
{
maxLeftBorderSum = leftBorderSum;
}
}
int maxRightBorderSum = 0;
int rightBorderSum = 0;
for (int i = center + 1; i <= right; i++)
{
rightBorderSum += a[i];
if (rightBorderSum > maxRightBorderSum)
{
maxRightBorderSum = rightBorderSum;
}
}
return Math.max(maxLeftSum, Math.max(maxRightSum, maxLeftBorderSum + maxRightBorderSum));
}
该算法能够按预期工作,并为我提供了最大的总和,但是,我很难找到最大值范围的开始和结束索引。例如,假设我们有一个数组:{5,-5,2,9}。由于总和必须是连续的,所以总和将为2 + 9 = 11,索引将为[2-3]。换句话说,我们不能仅仅使用5和9来制造14,因为它们并不相邻。
我希望能帮助您确定索引。