leetcode 740. 删除并获得点数

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

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

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

示例 1:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/delete-and-earn

思路

可以用动态规划来做

  • 取nums中最大nmax和最小值nmin,作为dp的边界
  • dp 表示[nmin-1,nmax]之间的连续数组
  • dp[0] = 0
  • dp[1] = nmin *(nmin出现的次数)
  • dp[i] =
    • dp[i-1] i+nmin-1 不在nums中
    • max(nmin-1+i *(nmin-1+i出现的次数) + dp[i-2], dp[i-1]) i+nmin-1 在nums中

案例演示:
在这里插入图片描述

实现

class Solution:
    def deleteAndEarn(self, nums) -> int:
        if len(nums)==1:return nums[0]
        nums.sort()
        mydic = {}
        for i,v in enumerate(nums):
            if v not in mydic: mydic[v] = []
            mydic[v].append(i)
        nmin = min(mydic)
        nmax = max(mydic)
        dp = [0 for _ in range(nmin-1,nmax+1)]
        dp[1] = nmin*len(mydic[nmin])
        for i in range(2,len(dp)):
            j = i+nmin-1
            dp[i] = dp[i-1] if j not in mydic else \
                max(len(mydic[j])*j + dp[i-2],dp[i-1])
        return dp[len(dp)-1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值