Kalyan Parajuli

Kalyan Parajuli

Infosec MS Student @ Carnegie Mellon University

© 2022

Dark Mode

Leetcode 740 - Delete and Earn (Medium)

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.

740 - Delete and Earn (Medium)

Example 1:

Input: nums = [3,4,2] Output: 6 Explanation: 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: 9 Explanation: 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.

Solution

# Leetcode rating
# 41st percentile runtime
# 15th percentile storage
class Solution:
    def deleteAndEarn(self, nums: List[int]) -> int:
        mx = 0
        for i in nums: mx = max(mx, i)
        count = [0]*(mx+1)
        
        for i in nums: print(i);count[i] += 1
        
        # Now this is set-up like a Adjacent Robber problem
        dp=[0]*(mx+1)
        dp[0]=0
        dp[1]=count[1]
        for i in range(2, mx+1):
            dp[i] = max(dp[i-2]+i*count[i], dp[i-1])
        
        return dp[-1]

Evaluation

41:15

Solution with lesser storage

class Solution:
    def deleteAndEarn(self, nums: List[int]) -> int:
        mx = 0
        for i in nums: mx = max(mx, i)
        count = [0]*mx        
        
        for i in nums: count[i-1] += 1
            
        # Now this is set-up like a Adjacent Robber problem
        sl = 0
        l = count[0]
        
        for i in range(2, len(count)+1):
            temp = l
            l = max(sl+i*count[i-1], l)
            sl = temp
        
        return l

Evaluation

41:66

Some others used dictionary for storage; while some used library methods like Counter and sorted.