Complete-Preparation

πŸŽ‰ One-stop destination for all your technical interview Preparation πŸŽ‰

View the Project on GitHub

Maximum sum of non-adjacent elements 🌟🌟

Recursive Approach

Code

int helper(vector<int>& nums, int i)
{
    if (i == 0) return nums[0]; // Base 1
    if (i < 0) return 0; // Base 2

    int pick = nums[i] + helper(nums, i - 2);
    int nonPick = helper(nums, i - 1);

    return max(pick, nonPick);
}

int maximumNonAdjacentSum(vector<int>& nums)
{
    int n = nums.size();
    return helper(nums, n - 1);
}

Memoization(Top-Down) Approach

Code

int helper(vector<int>& nums, vector<int>& memo, int i)
{
    if (i == 0) return nums[0]; // Base 1
    if (i < 0) return 0; // Base 2

    if (memo[i] != -1) return memo[i];

    int pick = nums[i] + helper(nums, memo, i - 2);
    int nonPick = helper(nums, memo, i - 1);

    return memo[i] = max(pick, nonPick);
}
int maximumNonAdjacentSum(vector<int>& nums)
{
    int n = nums.size();
    vector<int> memo(n + 1, -1);
    return helper(nums, memo, n - 1);
}

Tabulation(Bottom-Up) Approach

Code

int maximumNonAdjacentSum(vector<int>& nums)
{
    int n = nums.size();
    vector<int> dp(n, 0);
    dp[0] = nums[0]; // 1st base case
    for (int i = 1; i < n; i++) {

        int pick = nums[i];
        if (i > 1) pick += dp[i - 2]; // 2nd base case

        int nonPick = dp[i - 1];

        dp[i] = max(pick, nonPick);
    }
    return dp[n - 1];
}

Space Optimized Tabulation(Bottom-Up) Approach

Code

int maximumNonAdjacentSum(vector<int>& nums)
{
    int n = nums.size();
    int prev1 = nums[0]; // 1st base case
    int prev2 = 0;

    for (int i = 1; i < n; i++) {

        int pick = nums[i];
        if (i > 1) pick += prev2; // 2nd base case

        int nonPick = prev1;

        int curr = max(pick, nonPick);
        prev2 = prev1;
        prev1 = curr;
    }
    return prev1;
}