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

算法-每日一题(DAY10)打家劫舍

1.题目链接:

198. 打家劫舍 - 力扣(LeetCode)

2.题目描述:

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警

给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

示例 1:

输入:[1,2,3,1]
输出:4
解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4 。

示例 2:

输入:[2,7,9,3,1]
输出:12
解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。偷窃到的最高金额 = 2 + 9 + 1 = 12 。

提示:

1 <= nums.length <= 100
0 <= nums[i] <= 400

3.解题思路:

该问题采用动态规划解决,核心状态转移方程为:

dp[i]=max⁡(dp[i−1],dp[i−2]+nums[i])

dp[i] 表示前 i个房屋的最大偷窃金额

dp[i−1] 表示不偷第 i 间房屋时的最大收益

dp[i−2]+nums[i] 表示偷第 i 间房屋时的收益(需跳过前一间)

通过空间优化,代码用三个变量替代完整的 DP 数组:

  1. pas:存储 dp[i−2](前两间的最优解)

  2. pre:存储 dp[i−1](前一间的最优解)

  3. tem:临时保存状态(用于更新)

我们采用了动态规划的思路,通过不断更新每间房屋可以偷盗的最大金额,来解决“打家劫舍”问题。首先,判断如果没有房屋,则返回 0;如果只有一间房屋,则返回该房屋的金额。然后,定义两个变量 pas 和 pre,分别代表第 i-2 间房屋和第 i-1 间房屋的最大偷盗金额,并初始化这两个变量。接着,从第三间房屋开始,逐步计算每一间房屋的最大偷盗金额。对于每间房屋,判断偷或者不偷当前房屋,通过 pre 和 pas 来计算当前最大偷盗金额。具体来说,偷当前房屋时的金额是 pas + nums[i](即前两间房屋的偷盗金额之和);不偷当前房屋时,金额是 pre。更新 pre 和 pas,直到遍历完所有房屋。最终返回 pre,即最大偷盗金额。

4.题解代码:

class Solution {
public:int rob(vector<int>& nums){if (nums.empty())return 0;//如果没有房屋,则偷盗金额返回0if (nums.size() == 1)return nums[0];//如果只有一间房屋,则偷盗金额返回这间房屋的金额int pas = nums[0];//定义一个pas,代表第 i-2 间房屋的最大偷窃金额,初始化为第一间房屋的偷盗金额int pre = max(nums[0], nums[1]);//定义一个pre,代表第 i-1 间房屋的最大偷窃金额,初始化为前两间房屋的最大值int tem = 0;//定义一个tem,作为临时值储存当前prefor (int i = 2; i < nums.size(); i++){tem = pre;//储存pre的值pre = max(pre, pas + nums[i]); //选择偷或者不偷当前房屋pas = tem;//将pas更新为之前的pre}return pre;//返回最大偷盗金额}
};

5.示例演算:

输入数组:[2, 7, 9, 3, 1]

步骤当前房屋(i)nums[i]操作pas 值pre 值计算逻辑
初始---27-
129tem = pre
pre = max(7, 2+9)
pas = tem
711max⁡(7,2+9)=11
233tem = pre
pre = max(11, 7+3)
pas = tem
1111max⁡(11,7+3)=11
341tem = pre
pre = max(11, 11+1)
pas = tem
1112max⁡(11,11+1)=12

6.复杂度计算:

时间复杂度:它通过一次遍历处理每个房屋的金额,故时间复杂度是O(n)

空间复杂度:只使用了常数数量的额外变量,故空间复杂度为O(1)

相关文章:

  • 关于Seata的一个小issue...
  • 基于大模型的三叉神经痛预测及治疗方案研究报告
  • windows中通过git从远程快速只下载指定一个文件的批处理命令
  • Agent轻松通-P3:分析我们的Agent
  • Linux系统时间不对导致mysql初始化失败:Data Dictionary initialization failed.(数据字典版本验证失败)
  • Rust使用tokio(二)HTTPS相关
  • 深度学习笔记27-LSTM实现糖尿病探索与预测(Pytorch)
  • 【大数据】java API 进行集群间distCP 报错unresolvedAddressException
  • AWS EC2使用SSM会话管理器连接
  • HarmonyOS 6 + 盘古大模型5.5
  • day30 导包
  • GDI绘制
  • Unity3d中使用Mirror进行自定义消息通信
  • 水晶杂谈3:生物群系大家族,噪声函数塑地形
  • 基于k2-icefall实践Matcha-TTS中文模型训练
  • 解决Docker网络与虚拟机桥接冲突的实践指南
  • VC++ 服务守护qt用户级UI进程
  • QEMU学习之路(10)— RISCV64 virt 使用Ubuntu启动
  • c++set和pair的使用
  • 小白的进阶之路系列之十六----人工智能从初步到精通pytorch综合运用的讲解第九部分
  • 网站开发后台需要自己写吗/宁波网站推广联系方式
  • 商城网站的搜索记录代码怎么做/公关
  • 北京完美建设有限公司网站/seo权威入门教程
  • 热门的网站模板下载/市场营销网站
  • 重庆短视频培训/天津百度推广排名优化
  • 免费的购物网站源码/太原网站快速排名优化