我们可以在迭代数组时使用堆栈来记录不断增加的子序列。运行时间是线性的,因为每个元素进入和离开堆栈一次。
如果我们想输出实际的序列而不是它的长度,我们可以记录起始索引,然后找到它后面的所有元素的值更大。
这种线性时间算法有效吗?
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;
}