「LeetCode」337-打家劫舍|||⚡️

151 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情

大家好,我是速冻鱼🐟,一条水系前端💦,喜欢花里胡哨💐,持续沙雕🌲,是隔壁寒草🌿的好兄弟,刚开始写文章。 如果喜欢我的文章,可以关注➕点赞,为我注入能量,与我一同成长吧~

前言🌧️

算法,对前端人来说陌生又熟悉,很多时候我们都不会像后端工程师一样重视这项能力。但事实上,算法对每一个程序员来说,都有着不可撼动的地位。

因为开发的过程就是把实际问题转换成计算机可识别的指令,也就是《数据结构》里说的,「设计出数据结构,在施加以算法就行了」。

编写指令的好坏,会直接影响到程序的性能优劣,而指令又由数据结构和算法组成,所以数据结构和算法的设计基本上决定了最终程序的好坏

题目🦀

337. 打家劫舍 III

难度中等

小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为 root

除了 root 之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果 两个直接相连的房子在同一天晚上被打劫 ,房屋将自动报警。

给定二叉树的 root 。返回 在不触动警报的情况下 ,小偷能够盗取的最高金额

示例 1:

img

输入: root = [3,2,3,null,3,null,1]
输出: 7 
解释: 小偷一晚能够盗取的最高金额 3 + 3 + 1 = 7

示例 2:

img

输入: root = [3,4,5,1,3,null,1]
输出: 9
解释: 小偷一晚能够盗取的最高金额 4 + 5 = 9

提示:

  • 树的节点数在 [1, 104] 范围内
  • 0 <= Node.val <= 104

解题思路🌵

  • 利用树形DP来求解此题

解题步骤🐂

  • 步骤 确定dp含义

  • 确定遍历顺序

  • 确定递推公式

  • 本题dp数组就是一个长度为2的数组 [x,x] 第零位表示偷当前结点 第一位表示不偷当前结点的最大金额

  • 通过后续遍历来向上求解最大dp

  • 最后头结点就是 取下标0 和 下标1的最大值就是偷得的最大金钱

源码🔥

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number}
 */
var rob = function(root) {
 const postOrder = (node)=>{
     //递归出口
     if(!node){
         return [0,0]
     }

     //遍历左子树
        const left = postOrder(node.left)
     //遍历右子树
        const right = postOrder(node.right)
    //不偷当前结点,左右节点都可以偷或不偷,取最大值
    const DoNot = Math.max(left[0],left[1])+Math.max(right[0],right[1])
    //偷当前节点
    const Do = node.val + left[0] + right[0]
    // 【不偷,偷】
    return [DoNot,Do]
 }

 const res = postOrder(root)

 return Math.max(...res)

};

时间复杂度:O(n)

空间复杂度:O(logn)

结束语🌞

那么鱼鱼的LeetCode算法篇的「LeetCode」337-打家劫舍|||⚡️就结束了,算法这个东西没有捷径,只能多写多练,多总结,文章的目的其实很简单,就是督促自己去完成算法练习并总结和输出,菜不菜不重要,但是热爱🔥,喜欢大家能够喜欢我的短文,也希望通过文章认识更多志同道合的朋友,如果你也喜欢折腾,欢迎加我好友,一起沙雕,一起进步

github🤖:sudongyu

个人博客👨‍💻:速冻鱼blog

vx👦:sudongyuer

写在最后

伙伴们,如果喜欢我的口水话给🐟🐟点一个赞👍或者关注➕都是对我最大的支持。