查找递归子序列的索引范围

时间:2018-09-05 19:55:21

标签: java algorithm recursion sum divide-and-conquer

我有一个关于最大子序列算法的快速问题,该算法使用如下所示的分治法:

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,因为它们并不相邻。

我希望能帮助您确定索引。

0 个答案:

没有答案