Complete-Preparation

🎉 One-stop destination for all your technical interview Preparation 🎉

View the Project on GitHub

Longest Increasing Subsequence 🌟🌟

Tabulation(bottom-up)

Code

int longestIncreasingSubsequence(int arr[], int n)
{
    vector<vector<int>> dp(n + 1, vector<int>(n + 1, 0));
    for (int ind = n - 1; ind >= 0; ind--) {
        for (int prevInd = ind - 1; prevInd >= -1; prevInd--) {
            int notTake = dp[ind + 1][prevInd + 1];
            int take = 0;
            if (prevInd == -1 || arr[ind] > arr[prevInd]) {
                take = 1 + dp[ind + 1][ind + 1];
            }
            dp[ind][prevInd + 1] = max(take, notTake);
        }
    }
    return dp[0][0];
}

Space optimized tabulation

Code

int longestIncreasingSubsequence(int arr[], int n)
{
    vector<int> next(n + 1, 0);
    vector<int> curr(n + 1, 0);
    for (int ind = n - 1; ind >= 0; ind--) {
        for (int prevInd = ind - 1; prevInd >= -1; prevInd--) {
            int notTake = next[prevInd + 1];
            int take = 0;
            if (prevInd == -1 || arr[ind] > arr[prevInd]) {
                take = 1 + next[ind + 1];
            }
            curr[prevInd + 1] = max(take, notTake);
        }
        next = curr;
    }
    return next[0];
}

Algorithmic Approach

Code

int longestIncreasingSubsequence(int arr[], int n)
{
    vector<int> dp(n, 1);
    int ans = 1;
    for (int i = 0; i < n; i++) {
        for(int prev = 0; prev < i; prev++){
            if(arr[prev] < arr[i]){
                dp[i] = max(dp[i], dp[prev] + 1);
            }
        }
        ans = max(ans, dp[i]);
    }
    return ans;
}
int longestIncreasingSubsequence(int arr[], int n)
{
    vector<int> dp(n, 1),idxHash(n);
    int ans = 1, lastIdx = 0;

    for (int i = 0; i < n; i++) {
        idxHash[i] = i;
        for(int prev = 0; prev < i; prev++){
            if(arr[prev] < arr[i]){
                // dp[i] = max(dp[i], dp[prev] + 1);
                if(dp[prev] + 1 > dp[i]){
                    dp[i] = dp[prev] + 1;
                    idxHash[i] = prev;
                }
            }
        }
        // ans = max(ans, dp[i]);
        if(dp[i] > ans){
            ans = dp[i];
            lastIdx = i;
        }
    }
    vector<int> lis;
    lis.push_back(arr[lastIdx]);
    while(lastIdx != idxHash[lastIdx]){
        lastIdx = idxHash[lastIdx];
        lis.push_back(arr[lastIdx]);
    }
    reverse(lis.begin(), lis.end());
    for(int i = 0; i < lis.size(); i++){
        cout << lis[i] << " ";
    }

    return ans;
}