0

我们可以在迭代数组时使用堆栈来记录不断增加的子序列。运行时间是线性的,因为每个元素进入和离开堆栈一次。

如果我们想输出实际的序列而不是它的长度,我们可以记录起始索引,然后找到它后面的所有元素的值更大。

这种线性时间算法有效吗?

    public int longestIncreasingSubsequence(int[] seq) {
    int longest = 0;
    int curSize = 0;

    LinkedList<Integer> stack = new LinkedList<Integer>();

    for (int i : seq) {
        while (!stack.isEmpty() && i <= stack.get(0)) {
            stack.removeFirst();
            curSize--;
        }
        stack.addFirst(i);
        curSize++;
        if (curSize > longest) {
            longest = curSize;
        }
    }

    return longest;
}
4

1 回答 1

1

不,您编写的算法不正确。

考虑测试用例:15,20,12,25

After two pushes:
stack: 20,15
curSize: 2
longest: 2

In comes 12. So two pops.
curSize: 0

12 pushed:
stack: 12
curSize: 1
longest: 2

25 pushed:
stack: 25,12
curSize: 2
longest: 2 //so gives answer 2

但实际上答案应该是 3。

于 2014-05-01T16:39:53.857 回答