当前位置: 首页 > news >正文

【LeetCode】动态规划——198.打家劫舍、213.打家劫舍||、337.打家劫舍|||

LeetCode题目链接

https://leetcode.cn/problems/house-robber/
https://leetcode.cn/problems/house-robber-ii/description/
https://leetcode.cn/problems/house-robber-iii/description/

题解

198.打家劫舍
初始化:第一个房屋可抢的最大金额数就是第一个房屋的值,前两个房屋所抢最大金额值就是前两个房屋之中的金额最大值,因此dp[0]和dp[1] = max(…)就初始化好。
递推公式:抢当前房屋时,前一个房屋不能抢,因此要从前两个房屋所抢的值计算当前的值;不抢当前房屋时,所得的最大金额和前一个房屋是相同的,因此直接赋予前一个房屋的值。
特判:由于后续遍历数组时初始值从2开始,因此要对数组长度为1和长度为2时的情况特判,输出相应值。

213.打家劫舍||
环形的拆解方法:首元素和尾元素不能同时取到,因此分为除去尾元素取前n-1个数、除去首元素取后n-1个数这两种情况,由此将环形问题化为线性问题,重复两次计算最大金额数,取两个值的最大值即可。
同时注意特殊情况,在线性情况计算过程中,dp数组初始化时的nums的下标取值为start+1,这要求传入数组下标的距离范围必须大于2,也就是end和start的距离大于1,因此数组需要在长度为2和长度为1时特判(长度为2时start和end相等)。

337.打家劫舍|||
首先明确是后序遍历,【因为要用到先前遍历出来的左结点和右结点值】——来自代码随想录。具体来说,递推公式明确是二维,且用花括号表示,则为vector< int >类型,一维和二维分别表示不偷与偷,当不偷时,根结点所得得最大金额数为左结点和右结点不偷与偷的最大值之和,当偷时,根结点等于左结点和右结点不偷的值加上根结点值之和,需要注意,最终根结点存放的值即为当前不偷与偷所得结果最大值,再取两者之间的最大值即可。

代码

//198.打家劫舍
#include <iostream>
#include <vector>
using namespace std;class Solution {
public:int rob(vector<int>& nums) {if (nums.size() == 1) return nums[0];if (nums.size() == 2) return max(nums[0], nums[1]);vector<int> dp(nums.size(), 0);dp[0] = nums[0];dp[1] = max(nums[0], nums[1]);for (int i = 2; i < nums.size();i++) {dp[i] = max(dp[i - 1], dp[i - 2] + nums[i]);}return dp[nums.size() - 1];}
};int main() {Solution s;vector<int> nums = { 1,2,3,1 };printf("%d", s.rob(nums));return 0;
}
//213.打家劫舍||
#include <iostream>
#include <vector>
using namespace std;class Solution {
public:int rob(vector<int>& nums) {//特殊情况if (nums.size() == 1) return nums[0];if (nums.size() == 2) return max(nums[0], nums[1]);int result1 = rob2(nums, 0, nums.size() - 2);int result2 = rob2(nums, 1, nums.size() - 1);return max(result1, result2);}int rob2(vector<int>nums, int start, int end) {//初始化vector<int> dp(nums.size(), 0);dp[start] = nums[start];dp[start + 1] = max(nums[start], nums[start + 1]);//递推公式for (int i = start + 2;i <= end;i++) {dp[i] = max(dp[i - 1], dp[i - 2] + nums[i]);}return dp[end];}
};int main() {Solution s;vector<int> nums = { 1,2,3,1 };printf("%d", s.rob(nums));return 0;
}
//337.打家劫舍|||
#include <iostream>
#include <vector>
using namespace std;struct TreeNode {int val;TreeNode *left;TreeNode *right;TreeNode() : val(0), left(nullptr), right(nullptr) {}TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}};class Solution {
public:int rob(TreeNode* root) {vector<int> result = rob2(root);return max(result[0], result[1]);}vector<int> rob2(TreeNode* cur) {//特殊情况if (cur == NULL) return vector<int>{0, 0};//后序遍历vector<int> left = rob2(cur->left);vector<int> right = rob2(cur->right);//不偷与偷int val1 = max(left[0], left[1]) + max(right[0], right[1]);int val2 = cur->val + left[0] + right[0];return { val1, val2 };}
};int main() {Solution s;TreeNode* root = new TreeNode(3);root->left = new TreeNode(2);root->right = new TreeNode(3);root->left->right = new TreeNode(3);root->right->right = new TreeNode(1);printf("%d", s.rob(root));return 0;
}
http://www.dtcms.com/a/351356.html

相关文章:

  • 开发避坑指南(37):Vue3 标签页实现攻略
  • 【Python系列】Flask 和 FastAPI对比
  • 高性价比的云手机该怎样进行选择?
  • GraphRAG——v0.3.5版本
  • 从MySQL到OpenTenBase:电商平台分布式数据库架构升级实战
  • TCP协议11种状态
  • 【人工智能AI、机器学习ML、深度学习DL、基础模型FM、LLM、GPT、Generative AI 分别是什么?他们之间的关系是什么?】
  • 一个头像图片滚动轮播组件(React实现)
  • vscode有的结构体不能补全,有的可以补全问题的解决.
  • 校园资讯平台|校园资讯平台系统|基于java和小程序的校园资讯平台设计与实现(源码+数据库+文档)
  • 《数据之心》——鱼小妖的觉醒(童年篇)
  • 【国密证书】CentOS 7 安装 GmSSL 并生成国密证书
  • SpringBoot启动优化
  • 肌肉力量训练
  • 【C语言练习】汉诺塔
  • 金融市场微观行为分析结合深度学习的大单过滤与短期价格预测框架
  • 【资源分享】破解极域电子教室
  • 【云计算】云原生(Cloud Native)
  • 三、显示3D文字
  • 【车载开发系列】CS+ for CC开发环境IDE
  • 探索 3D 模型格式:综合指南glTF/GLB 格式
  • CVPR论文速递 | DL3DV-10K:10K+真实场景,打破三维视觉数据荒!
  • Maya绑定基础:创建骨骼和蒙皮、蒙皮权重控制的两种方法
  • 当自然语言遇上数据库:Text2Sql.Net的MCP革命如何重新定义开发者与数据的交互方式
  • 腾讯云DTS数据库迁移底层原理与实战解析
  • 云上“安全管家”|移动云以云安全中心为企业数字化升级保驾护航
  • MySQL 面试题系列(三)
  • 模块 PCB 制造:高频场景下的工艺难点与猎板质量管控体系
  • CentOS 7 服务器初始化完整流程
  • 文献阅读笔记【雷达辐射源识别】:Recognition of Unknown Radar Emitters with Machine Learning