740. 删除并获得点数
难度中等257收藏分享切换为英文接收动态反馈
给你一个整数数组 nums ,你可以对它进行一些操作。
每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除每个等于 nums[i] - 1 或 nums[i] + 1 的元素。
开始你拥有 0 个点数。返回你能通过这些操作获得的最大点数。
示例 1:
1 | 输入:nums = [3,4,2] |
示例 2:
1 | 输入:nums = [2,2,3,3,3,4] |
提示:
1 <= nums.length <= 2 * 10^41 <= nums[i] <= 10^4
解题思路
通过预处理数组将该问题转换成打家劫舍问题
哈希表+动态规划
若选择了 $x$,则可以获取$ \textit{sum}[x]$ 的点数,且无法再选择 $x-1$ 和 $x+1$。这与打家劫舍中的描述是一样的(相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。)的意思是一样的。 所不同的是:这个题目里面是对数字的相邻做了要求,可以使用哈希表来实现数字的相邻的判断,这样就可以将原先的问题转换到打家劫舍问题上来。
1 | class Solution { |
动态规划优化空间复杂度
1 | class Solution { |
动态规划
1 | class Solution { |
排序+动态规划
1 | class Solution { |
回溯超时
1 | class Solution { |
参考文献