gpt4 book ai didi

algorithm - 最长递增子序列——线性时间解?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:27:07 25 4
gpt4 key购买 nike

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

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

这个线性时间算法行得通吗?

    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;
}

最佳答案

没有。你写的算法不正确。

考虑测试用例: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。

关于algorithm - 最长递增子序列——线性时间解?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23411884/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com