首页 > 其他分享 >代码随想录|打家劫舍问题

代码随想录|打家劫舍问题

时间:2023-06-30 18:55:05浏览次数:35  
标签:right nums 代码 随想录 self 打家劫舍 节点 dp left

198.打家劫舍 

213.打家劫舍II  

337.打家劫舍III


 

198.打家劫舍

class Solution:
    def rob(self, nums: List[int]) -> int:
        n = len(nums)
        if n == 0:
            return  0
        dp = [0 for _ in range(n+1)]
        dp[1] = nums[0]
        for i in range(2, n+1):
            dp[i] = max(dp[i-1], dp[i-2]+nums[i-1])
        return dp[n]

 


213.打家劫舍II

有环的问题

考虑有第一个和无第一个

class Solution:
    def rob(self, nums: List[int]) -> int:
        n = len(nums)
        if n == 1:
            return nums[0]

        dp1 = [0 for _ in range(n+1)]
        dp1[1] = nums[0]
        for i in range(2, n):
            dp1[i] = max(dp1[i-1], dp1[i-2]+nums[i-1])
        
        dp2 = [0 for _ in range(n+1)]
        for i in range(2, n+1):
            dp2[i] = max(dp2[i-1], dp2[i-2]+nums[i-1])
        
        return max(dp1[n-1], dp2[n])

 


337.打家劫舍 III

这道题目算是树形dp的入门题目,因为是在树上进行状态转移,我们在讲解二叉树的时候说过递归三部曲,那么下面我以递归三部曲为框架,其中融合动规五部曲的内容来进行讲解

  1. 确定递归函数的参数和返回值

    这里我们要求一个节点 偷与不偷的两个状态所得到的金钱,那么返回值就是一个长度为2的数组。

    其实这里的返回数组就是dp数组。

    所以dp数组(dp table)以及下标的含义:下标为0记录不偷该节点所得到的的最大金钱,下标为1记录偷该节点所得到的的最大金钱。

  1. 确定终止条件

    在遍历的过程中,如果遇到空节点的话,很明显,无论偷还是不偷都是0,所以就返回

  1. 确定遍历顺序

    首先明确的是使用后序遍历。 因为要通过递归函数的返回值来做下一步计算。

    通过递归左节点,得到左节点偷与不偷的金钱。

    通过递归右节点,得到右节点偷与不偷的金钱。

  1. 确定单层递归的逻辑

    如果是偷当前节点,那么左右孩子就不能偷,val1 = cur->val + left[0] + right[0]; (如果对下标含义不理解就再回顾一下dp数组的含义

    如果不偷当前节点,那么左右孩子就可以偷,至于到底偷不偷一定是选一个最大的,所以:val2 = max(left[0], left[1]) + max(right[0], right[1]);

    最后当前节点的状态就是{val2, val1}; 即:{不偷当前节点得到的最大金钱,偷当前节点得到的最大金钱

  1. 举例推导dp数组

    以示例1为例,dp数组状态如下:(注意用后序遍历的方式推导)

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def rob(self, root: Optional[TreeNode]) -> int:
        # dp数组(dp table)以及下标的含义:
        # 1. 下标为 0 记录 **不偷该节点** 所得到的的最大金钱
        # 2. 下标为 1 记录 **偷该节点** 所得到的的最大金钱
        dp = self.traversal(root)
        return max(dp)

    # 要用后序遍历, 因为要通过递归函数的返回值来做下一步计算
    def traversal(self, node):
        
        # 递归终止条件,就是遇到了空节点,那肯定是不偷的
        if not node:
            return (0, 0)

        left = self.traversal(node.left)
        right = self.traversal(node.right)

        # 不偷当前节点, 偷子节点
        val_0 = max(left[0], left[1]) + max(right[0], right[1])

        # 偷当前节点, 不偷子节点
        val_1 = node.val + left[0] + right[0]

        return (val_0, val_1)

 

标签:right,nums,代码,随想录,self,打家劫舍,节点,dp,left
From: https://www.cnblogs.com/fangleSea/p/17517640.html

相关文章

  • 一文拆解“复杂软件”的无代码配置逻辑
    最近教研组的小伙伴们收到了一些用户在试用smardaten过程中的困惑。为了解答大家的疑问,今天特别邀请了教研组的美女小姐姐,以一个比较简单易理解的场景“疫情填报”,来拆解一下smardaten如何支撑应用的搭建逻辑,以及smardaten作为企业级无代码与轻量级无代码的配置逻辑差异。课程视频......
  • 托管代码和非托管代码
    托管代码:生成的exe可执行文件中间语言代码直接托管给CLR进行负责(C#)非托管代码:生成的exe可执行文件代码操作系统可以直接加载内存中运行(C,C++)CLR(公共语言运行时):JIT(实时编译器),GC(垃圾回收机制),内存管理,异常处理,跨语言调试中间语言:CILMSIL......
  • 【后端】SSM框架下REST风格代码注释详解
    前言最近学习了一下SSM,不得不说,spring不用注解真的是天打雷劈,就那个bean真的就是折磨人。下面是我总结的spring注解。@Value此注解可以用来获取导入的jdbc.properties文件的值。@Value("${jdbc.driver}")privateStringdriver;//用法是这样的12jdbc.properties文件:jdbc.driv......
  • 页码代码开始
    <!--页码代码开始Addbyxiaojiang20230630--><?phpif($page_count<10){for($i=1;$i<$page_count+1;$i++){echo'<ahref="?page='.$i.$pageStr.'">'.$i.'</a>';......
  • Linux使用HTTP隧道代理代码示例模版
    以下是一个使用HTTP隧道代理的示例代码模板:```pythonimportrequestsdefsend_request(url,proxy_host,proxy_port):#设置代理proxies={'http':f'http://{proxy_host}:{proxy_port}','https':f'http://{proxy_host}:{proxy_port}'}try:#发送请求respon......
  • AI自动生成代码,是时候冷静下来思考如何保障代码安全了
    HDC期间可参与华为开发者大会Check新人抽奖活动,活动链接在文末,快来参与!华为开发者大会2023将于7月7日与各位开发者进行见面,本次大会的主题演讲内容为:AI重塑千行百业。自从AI聊天被推出之后,其热度就一直是高居不下。身边的小伙伴们和其是什么都交流:日常聊天,国际局势,宇宙真理,人生哲......
  • C++代码中字符串分多行时的情况
    #include<iostream>intmain(constintargc,constchar*argv[]){std::stringstrSql1="select*fromtable\whereid=1\andname='name'";std::cout<<strSql1<<std::endl;std::stringst......
  • 基于UDS的BootLoader上位机源代码的重写版本,该版本使用C#语言编写。该上位机源代码支
    基于UDS的BootLoader上位机源代码的重写版本,该版本使用C#语言编写。该上位机源代码支持ISO15765通信协议,并且兼容PeakCAN、ZJGCAN等多种CAN卡。此外,它还支持解析S-record格式的二进制文件基于UDS的BootLoader上位机源代码(C#)基于UDS的BootLoader上位机源代码,支持ISO15765通信,支持......
  • 一份EtherCAT主站的FPGA Verilog代码 ethercat 主站 FPGA verilog 代码
    一份EtherCAT主站的FPGAVerilog代码ethercat主站FPGAverilog代码涉及到的知识点和领域范围是:EtherCAT通信协议、FPGA(现场可编程门阵列)和Verilog(硬件描述语言)。原创文章,转载请说明出处,资料来源:http://imgcs.cn/5c/652098268519.html首先,让我们来介绍一下EtherCAT通信协议。E......
  • 赛灵思FPGA匹配CMV2000,图纸资料齐全,提供代码及说明,pcb等,可科研,可生产
     "赛灵思公司的可编程逻辑器件(FPGA)与CMV2000相匹配,我们提供了完整的图纸资料,包括代码和说明,还有PCB设计等。这些资源既可以用于科研,也可以用于生产。"涉及到的知识点和领域范围包括:1.赛灵思(Xilinx):赛灵思是一家知名的半导体公司,专注于可编程逻辑器件(FPGA)和相关技术的研发和制造......