# 删除与获得点数

给你一个整数数组 nums ,你可以对它进行一些操作。

每次操作中,选择任意一个nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除每个等于 nums[i] - 1nums[i] + 1 的元素。

开始你拥有 0 个点数。返回你能通过这些操作获得的最大点数。

# 示例 1:

输入:nums = [3,4,2]
输出:6
解释:
删除 4 获得 4 个点数,因此 3 也被删除。
之后,删除 2 获得 2 个点数。总共获得 6 个点数。

# 示例 2:

输入:nums = [2,2,3,3,3,4]
输出:9
解释:
删除 3 获得 3 个点数,接着要删除两个 2 和 4 。
之后,再次删除 3 获得 3 个点数,再次删除 3 获得 3 个点数。
总共获得 9 个点数。

# 分析

这道题的动态规划, 与 198.打家劫舍 (opens new window) 的状态转移是差不多的。

使用 dp[i] 来记录 删除之后得到的点数

dp[i] = Max(dp[i], dp[i-1])

当需要对已有的数据进行排列,以实现动态规划。

nums = [2,3,4,5,3,5] =>

sums = [0,0,2,6,4,10]

sums[i] = nums中 i 的 总和

# 代码

var deleteAndEarn = function(nums) {
    let maxVal = Math.max(...nums)
    let sums = new Array(maxVal+1).fill(0)
    for(let num of nums){
        sums[num] += num
    }
    let first = sums[0] ,second = Math.max(sums[0],sums[1])
    for(let i=2;i<sums.length;i++){
        let temp = second
        if(first + sums[i] > second) second = first + sums[i]
        first = temp
    }
    return second
};

# ## 参考资料