# 删除与获得点数
给你一个整数数组 nums
,你可以对它进行一些操作。
每次操作中,选择任意一个nums[i]
,删除它并获得 nums[i]
的点数。之后,你必须删除每个等于 nums[i] - 1
或 nums[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
};