| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 【Leetcode】打家劫舍 -> 正文阅读 |
|
[数据结构与算法]【Leetcode】打家劫舍 |
题目链接:198. House Robber? ??213. House Robber II? ? ?337. House Robber III 1、打家劫舍I 相邻两家不能同时打劫,dp[i]表示打劫到第i家能够盗取到的最高金额。用动态规划,状态转移方程为:dp[i]=max(dp[i-2]+nums[i],dp[i-1]) 因为求dp[i]只需用到前面两个数dp[i-1],dp[i-2],所以可以不用数组,直接用两个变量表示即可。 代码如下:
2、打家劫舍II 所有房屋连成一个环,相邻两家不能同时打劫,第一家和最后一家相邻,肯定只能打劫一个。 那么就分成两种情况,1)打劫第1家,最后一家一定不能打劫。2)不打劫第1家,最后一家可以打劫也可以不打劫。其余和“打家劫舍I”相同,求这两种情况的较大者就是最终的值。 代码如下:
3、打家劫舍III 所有家庭组成一棵二叉树,直接相连的家庭不能都被打劫,即若父节点被打劫,那么直接相连的两个子节点都不能被打劫,若父节点不被打劫,那么直接相连的两个子节点都可以被打劫,也可以不被打劫。 用f(node)表示node节点被打劫,从该节点和其所有孩子节点家中能盗取的最大金额。 g(node)表示node节点不被打劫,从其所有孩子节点家中能被盗取的最大金额。 那么: f(node)=node.val+g(node.left)+g(node.right) g(node)=max(f(node.left),g(node.left))+max(f(node.right),g(node.right)) 那么很明显可以看出,f和g不能是数组了,应该是哈希表map,key是节点,value是对应的金额。 而且node节点对应的value值依赖于其孩子节点,所以应该是从最底层的节点一步一步向上更新的,所以需要使用深度优先搜索dfs(递归)。(相当于用递归对二叉树进行了一次后序遍历。) 代码如下:
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 16:23:06- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |