如何入侵网站后台密码,南通专业做网站公司,织梦网络设计工作室网站模板,雄安建设工程信息网基础题
打家劫舍https://leetcode.cn/problems/house-robber/
小白解法
删除nums[i]就会使得所有nums[i]-1和nums[i]1的值都消失#xff0c;手写了几个#xff0c;发现找来找去不方便#xff0c;还不如先排个序#xff0c;然后这样nums[i]-1和nums[i]和nums[i]1就能靠在…基础题
打家劫舍https://leetcode.cn/problems/house-robber/
小白解法
删除nums[i]就会使得所有nums[i]-1和nums[i]1的值都消失手写了几个发现找来找去不方便还不如先排个序然后这样nums[i]-1和nums[i]和nums[i]1就能靠在一起了这样删的时候方便找。只要获得一次nums[i]的点数那么肯定是要一起把所有的nums[i]都要带上的也就是获得nums[i]*nums[i]次数个点数
嗯发现[1,1,1,2,2,3,4,5]的时候怎么这么熟悉选1就不能选2选2就不能选3这不是相邻的2个数不能一起选这不是打家劫舍吗
但是也有所区别当相邻的2个值相差不是1时可以直接获得不需要“打家劫舍”。我们此时说的“相邻”是在[1,2,3,4]这个新构造的数组上的相邻而不是原数组[1,1,1,2,2,3,4,5]未知的相邻。 也就是把每个相同元素的数字看成1个数其对应的能获得点数是nums[i]*nums[i]次数。
那么要怎么新构造的数组可以使用C风格的直接[0 for i in range(max(nums))]构造一个可能超长的数组然后把对应位置的元素填上解起来就跟打家劫舍的写法一模一样了也可以使用一个字典num2value统计key能获得的value然后在判断的时候加入是否abs(nums[i]-nums[i-1])1。
我个人还是倾向于字典的写法
class Solution:def deleteAndEarn(self, nums: List[int]) - int:# 统计每个数字对应能获得的点数from collections import defaultdictnum2valuedefaultdict(int)for n in nums:num2value[n]n# 构造新数组sorted_nums sorted_numssorted(set(nums))if len(sorted_nums)1:return num2value[nums[0]]if len(sorted_nums)2:if abs(sorted_nums[0]-sorted_nums[1])1:return max(num2value[sorted_nums[0]],num2value[sorted_nums[1]])else:return num2value[sorted_nums[0]]num2value[sorted_nums[1]]# 上述特殊情况# 下面是初始化转移方程dp[0 for _ in range(len(sorted_nums))]dp[0]num2value[sorted_nums[0]]if abs(sorted_nums[0]-sorted_nums[1])1:# 如果是相邻元素那么就是打家劫舍式的更新dpdp[1] max(num2value[sorted_nums[0]],num2value[sorted_nums[1]])else:# 若不是可以直接不受影响dp[1] num2value[sorted_nums[0]]num2value[sorted_nums[1]]for i in range(2,len(sorted_nums)):if abs(sorted_nums[i]-sorted_nums[i-1])!1:dp[i]dp[i-1]num2value[sorted_nums[i]]else:select_nownum2value[sorted_nums[i]]dp[i-2]unselect_nowdp[i-1]dp[i]max(select_now,unselect_now)# print(dp)return dp[-1]在写完下方的一般情况后仍然不要忘了特殊情况下方的下标是有i-1和i-2的这两种需要单独去返回。
不得不说小白写法写的真的很繁琐不优美但是便于理解。