leetcode:删除并获得点数
给你一个整数数组 nums ,你可以对它进行一些操作。
每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除 所有 等于 nums[i] - 1 和 nums[i] + 1 的元素。
开始你拥有 0 个点数。返回你能通过这些操作获得的最大点数。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/delete-and-earn
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
很简单的方式:把次数和总数排序起来,再打家劫舍。
解题思路
最简单就是把次数和总数排序起来,在没有出现的数字设置为0,然后再用打家劫舍的方法。
例如(5,3,3,7)就可以利用排序,排成(3,3,5,7),然后从3开始把数补上去,并将取数的次数合列成一个列表,等于(6,0,5,0,7),他分别对应数字(3,4,5,6,7)的总数。最后再打家劫舍。
代码
class Solution:
def deleteAndEarn(self, nums: List[int]) -> int:
l = sorted(dict(Counter(nums)).items(),key=lambda x:x[0]) #排序
nums = []
n = l[-1][0] #取出数字上限
m = l[0][0] #取出数字下限
#总和排序
for i in l:
while 1:
if m<n and i[0]!=m:
nums.append(0)
m+=1
else:
break
nums.append(i[0]*i[1])
m+=1
#打家劫舍代码
a,b = 0 ,0
for i in nums:
a, b = b,max(b,a+i)
return b
作者:onwards
链接:https://leetcode.cn/problems/delete-and-earn/solution/by-onwards-s0my/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。