Skip to content

Example: Longest Increasing Subsequence

Roberto Fronteddu edited this page Apr 14, 2024 · 2 revisions

Given a sequence, find the longest ordered subsequence. Example: 3, 4, -1, 0, 6, 2, 3 => -1, 0, 2, 3

package leetcode_exercises.dp;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class LongestIncreasingSubsequence
{
    public static int lis (int[] nums) {
        int[] dp = new int[nums.length];
        int endIndex = 0;
        int maxLen = 0;

        for (int i = 0; i < nums.length; i++) {
            dp[i] = 1;
        }

        for (int i = 1; i < nums.length; i++) {
            for (int j = 0; j < i; j++) {
                if (nums[j] < nums[i] && dp[j] + 1 > dp[i]) {
                    dp[i] = dp[j] + 1;
                    if (dp[i] > maxLen) {
                        maxLen = dp[i];
                        endIndex = i;
                    }
                }
            }
        }

        // reconstruct LIS
        List<Integer> lis = new ArrayList<> ();
        lis.add (nums[endIndex]);
        int len = maxLen - 1;
        for (int i = endIndex - 1; i >= 0; i--) {
            if (dp[i] == len && nums[i] < lis.get (lis.size () - 1)) {
                lis.add (nums[i]);
                len--;
            }
        }
        Collections.reverse(lis);
        lis.forEach (x -> System.out.print (x + " "));

        return dp[nums.length - 1];
    }
}

Clone this wiki locally