【发布时间】:2014-05-01 16:23:29
【问题描述】:
我们可以在迭代数组时使用堆栈来记录不断增加的子序列。运行时间是线性的,因为每个元素进入和离开堆栈一次。
如果我们想输出实际的序列而不是它的长度,我们可以记录起始索引,然后找到它之后的所有具有更大值的元素。
这种线性时间算法有效吗?
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;
}
【问题讨论】:
-
我试过了,它给出了正确的结果。但很难说它是否是 O(n)。维基百科和其他来源都将此问题标记为 O(nlogn)
-
也许你把子串(连续)和子序列(不需要连续)混淆了
-
@NiklasB。这也不会给出最长的增加子字符串。
-
@RikayanBandyopadhyay 我认为是的。
-
@NiklasB。
1,2,3,8,4,5呢?结果为 5。
标签: algorithm stack sequence lis