0

スタックを使用して、配列を反復しながら増加するサブシーケンスを記録し続けることができます。各要素はスタックに 1 回出入りするため、実行時間は線形です。

その長さではなく実際のシーケンスを出力したい場合は、開始インデックスを記録し、その後のすべての要素をより大きな値で見つけることができます。

この線形時間アルゴリズムは機能しますか?

    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