计算数组中最长有序子序列的长度

时间:2015-01-06 14:56:41

标签: java

我正在查看https://projecteuler.net/等网站,我遇到了这个问题:

“给定长度为N> 0的无序数组,计算数组中最长有序(从左[下部索引]到右部[更高索引])子序列的长度。”

对于我的生活,我很难找到Java解决方案。有人可以帮忙吗?

编辑:

一些例子:

示例1

输入:[1,4,1,4,2,1,3,5,6,2,3,7] 预期产出:4

示例2

输入:[3,1,4,1,5,9,2,6,5,3,5] 预期产出:3

示例3

输入:[2,7,1,8,2,8,1] 预期产出:2

2 个答案:

答案 0 :(得分:3)

您想要找到的术语是一个子阵列,而不是一个子序列(根据您的示例)。您可以使用简单的循环在线性时间内解决它:

int res = 0;
int cur = 0;
for (int i = 0; i < a.length; i++) {
    if (i > 0 && a[i] <= a[i - 1])
        cur = 0;
    cur++;
    res = Math.max(res, cur);
}

答案 1 :(得分:0)

目前尚不清楚相同的元素是否被认为是有序的。如果没有足够的元素来创建更大的maxLength,你也可以return

public static int maxLength(int[] array) {
    if (array.length <= 1) return array.length; // check for null also
    int maxLength = 1;
    int curLength = 1;
    for (int i = 1; i < array.length; i++) {
        //extra check to finish earlier if possible (you may omit it)
        if ((array.length - i + curLength) <= maxLength)
            return maxLength;
        if (array[i] > array[i-1]) //use >= if equal elements count too
            curLength++;
        else {
            if (maxLength < curLength)
                maxLength = curLength;
            curLength = 1;
        }

    }
    //final check (in case the last element is included in maxLength)
    if (maxLength < curLength)
        return curLength;
    return maxLength;
}