• 【小白友好】LeetCode 删除并获得点数


    基础题

    打家劫舍https://leetcode.cn/problems/house-robber/

    小白解法

    • 删除nums[i]就会使得所有nums[i]-1nums[i]+1的值都消失,手写了几个,发现找来找去不方便,还不如先排个序,然后这样nums[i]-1nums[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 defaultdict
            num2value=defaultdict(int)
    
            for n in nums:
                num2value[n]+=n
            # 构造新数组sorted_nums        
            sorted_nums=sorted(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:
    	        # 如果是相邻元素,那么就是打家劫舍式的更新dp
                dp[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_now=num2value[sorted_nums[i]]+dp[i-2]
                    unselect_now=dp[i-1]
    
                    dp[i]=max(select_now,unselect_now)
            # print(dp)
            return dp[-1]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    在写完下方的一般情况后,仍然不要忘了特殊情况,下方的下标是有i-1和i-2的,这两种需要单独去返回。

    不得不说小白写法写的真的很繁琐,不优美,但是便于理解。

  • 相关阅读:
    一文了解如何安全有效的进行PB级别的大数据迁移
    Rust 深度学习库 Burn
    构建镜像,执行chown -R非常慢
    Maven第四章:配置文件详解
    码蹄集 - MT3111· 赋值
    Leecode热题100---128:最长连续数列
    【Java】方法
    Pandas中的iloc函数; 查看.pt文件内容
    Linux getopt函数的使用
    SpringCache-缓存技术
  • 原文地址:https://blog.csdn.net/Yonggie/article/details/136451012