π One-stop destination for all your technical interview Preparation π
i
, f(i)
is the maximum sum of non-adjacent elements till index i
.
f(i) = ...+ nums[i-4] + nums[i-2] + nums[i]
nums[i] + f(i-2)
0 + f(i-1)
0
then it means we havenβt picked 1st indexed element. so we can safely return nums[0]
.i-2
, it can become negative. So we need to handle that case and return 0
in that case.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);
}
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);
}
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];
}
i-1
and i-2
then it can be solved in O(1)
space.prev2 = dp[n-2];
prev1 = dp[n-1];
curr = max(pick, notPick);
dp[n-1]
i.e. prev1
.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;
}