Top 100 Linked Question 修炼------第337题

博客围绕 LeetCode 337 题“打家劫舍 III”展开。题目是小偷在二叉树结构房屋中偷窃,不能偷相邻房屋,求最大偷窃金额。解题思路涉及递归和动态规划,分析出状态转移方程,代码实现用列表保存不同情况,最后返回根节点最大值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

337. House Robber III

题目链接

题目解释:小偷又找到了一个新的偷窃场所啦。到达这个区域只有唯一的入口,这个入口叫做“root",与根相邻的位置,每一个房间只有一"双亲房间",在逛了一遍之后,这个聪明的小偷发现,所有的房屋连接起来是一棵二叉树。如果直接相连的两个房子在同一天晚上被破门而入的话,警察就会到来。

求:在不惊动警察的情况下,这个小偷一天晚上能够偷到的最大数量的钱币。

Example 1:

Input: [3,2,3,null,3,null,1]

     3
    / \
   2   3
    \   \ 
     3   1

Output: 7 
Explanation: Maximum amount of money the thief can rob = 3 + 3 + 1 = 7.

Example 2:

Input: [3,4,5,1,3,null,1]

     3
    / \
   4   5
  / \   \ 
 1   3   1

Output: 9
Explanation: Maximum amount of money the thief can rob = 4 + 5 = 9.

题目分析:在二叉树中,相隔一个节点去进行偷窃,这题的难点主要是思路。还记得之前写过这样的一句话:在树相关的问题中,我们需要尽可能的采用递归的思想去思考,这样对我们解决出问题有更大的帮助,但是,问题是:我们如何去采用递归解决问题?难道是相隔一个节点进行一次偷窃?肯定不是,他只是为了不惊动警察,然后怎么偷取最大的钱币怎么来。同时,涉及到怎么才能偷窃到最多的钱币,那么应该也可以朝着DP方向去思考。很容易的可以进行分析状态转移方程:

给定到从叶子节点到第 i - 2 层抢劫的最大值 max[i-2],从叶子节点到第 i - 1 层抢劫的最大值 max[i-1],第 i 层节点的值,那么是否可以得到从叶子节点到第 i 层节点的最大值呢?答案是肯定的。max[i] = Math.max(max[i-2]+val(a), max[i-1])。

道理能想明白,代码有点难写。用到了一个有两个元素的列表,分别保存了之前层的,不取节点和取节点的情况。然后遍历左右子树,求出当前节点取和不取能得到的值,再返回给上一层。注意这个里面的robcurr是当前节点能达到的最大值,所以最后返回结果的时候试试返回的root节点robcurr的值。
注意返回两个变量的含义:

rob[1]存储的是从叶子节点到当前节点抢劫的最大值,
rob[0]存储的是从叶子节点到当前节点的左右孩子层节点抢劫到的最大值(当前节点的下一层,即决定当前节点不抢)

class Solution:
    def rob(self, root: TreeNode) -> int:
        def dfs(root):
            if not root:
                return [0, 0]
            robLeft = dfs(root.left)
            robRight = dfs(root.right)
            # 当前节点不抢
            norobCur = robLeft[1] + robRight[1]
            # 当前节点抢的话所能获得的最大值
            robCur = max(robLeft[0] + robRight[0] + root.val, norobCur)
            return [norobCur, robCur]
        return dfs(root)[1]

总结

2019/6/23:偷个懒,没刷题,发现一周过去了,这样不好,持之以恒的学习,持之以恒的刷题,加油!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值