用于最长非递减数字数组的递归,除法和征服算法

时间:2011-10-11 00:13:03

标签: algorithm

我遇到了一些严重的问题。我需要一个“分割和征服”的递归算法,它告诉我最长的非递减数字数组的长度。就个人而言,我会在仔细阅读问题之前选择使用我编写的代码。

 int bestIndex = 0;
    int bestLength = 0;
    int curIndex = 0;
    int curLength = 1;

    for (int i = 1; i < a.length; i ++){
        if (a[i] >= a[i-1]){
            curLength ++;
        }else {
            curLength = 1;
            curIndex = i;
        }
        if (curLength > bestLength){
            bestIndex = curIndex;
            bestLength = curLength;
        }
    }
    return bestLength;

问题在于作业要求我使用分而治之,我想不出一种方法可以做到。

一个例子是“4 2 3 3 1 2 4 5 9 2” 由于“1 2 4 5 9”

,它将返回“5”

非常感谢任何帮助。

由于

2 个答案:

答案 0 :(得分:0)

您确定子阵列需要由连续元素组成吗?对于子序列来说,这个问题变得更有趣......

无论如何,如果你需要分而治之的算法,请尝试遵循基本蓝图:

function f(array) =
    if array is empty or constant size or something like that
        handle base case
    else
        result1 <- f(first half of the array)
        result2 <- f(second half of the array)
        return some_way_to_combine(result1, result2)

当然,你需要正确选择应该返回的f来帮助你。您将需要处理增加的子阵列在其跨越边界的情况下的一半内部的情况。

答案 1 :(得分:0)

另一个答案是一个很好的通用答案。

但是,我建议关键是知道在结合结果时你需要回答什么问题。如果结果1表示数组[i,j],结果2表示[j + 1,k],那么这些是您需要回答的问题:

  • 在j?
  • 结束的最长非递减序列是什么?
  • 从j + 1开始的最长非递减序列是什么?
  • 到目前为止我看到的最大长度序列是多少(包括以j结尾并从j + 1开始的序列)?

如果您假设您已经可以针对result1和result2回答这些问题,那么您应该能够为您的组合结果定义答案[i,k](即从i开始的最长序列,以及从k开始的最长序列,如以及迄今为止你见过的最长的那些,包括那两个。)