Skip to main content

Delete and Earn

Problem statement​

You are given an integer array nums. You want to maximize the number of points you get by performing the following operation any number of times:

  • Pick any nums[i] and delete it to earn nums[i] points. Afterwards, you must delete every element equal to nums[i] - 1 and every element equal to nums[i] + 1.

Return the maximum number of points you can earn by applying the above operation some number of times.

Example 1:

Input: nums = [3,4,2]Output: 6Explanation: You can perform the following operations:- Delete 4 to earn 4 points. Consequently, 3 is also deleted. nums = [2].- Delete 2 to earn 2 points. nums = [].You earn a total of 6 points.

Example 2:

Input: nums = [2,2,3,3,3,4]Output: 9Explanation: You can perform the following operations:- Delete a 3 to earn 3 points. All 2's and 4's are also deleted. nums = [3,3].- Delete a 3 again to earn 3 points. nums = [3].- Delete a 3 once more to earn 3 points. nums = [].You earn a total of 9 points.

Constraints:

  • 1 <= nums.length <= 2 * 104
  • 1 <= nums[i] <= 104

My solution​

/**
* @param {number[]} nums
* @return {number}
*/
var deleteAndEarn = function(nums) {
const dp = Array.from({
length: Math.max(...nums) + 1
}, () => 0)

for (const num of nums) {
dp[num] += num
}


for (let i = 2; i < dp.length; i++) {
// current + n - 2, since prev will be deleted
let curr = dp[i - 2] + dp[i];
// max of prev 2 values
let prev = Math.max(dp[i -2], dp[i - 1])
dp[i] = curr;
dp[i - 1] = prev;

// console.log(dp)
}

return Math.max(dp[dp.length - 1], dp[dp.length - 2])
};