
leetcode191-打家劫舍
初始检查:检查输入数组的长度,处理边界情况。 边界初始化: 动态规划:从第三个房屋开始,依次计算每个房屋能偷窃到的最大金额。 结果返回:
发布日期:2025-04-05 03:19:53
浏览次数:8
分类:精选文章
本文共 1055 字,大约阅读时间需要 3 分钟。
为了解决这个问题,我们需要找到在不触动警报装置的情况下,一夜之内能够偷窃到的最高金额。这个问题可以通过动态规划来解决。
方法思路
我们可以通过动态规划的方法来解决这个问题。具体步骤如下:
问题分析:每间相邻的房屋不能同时被偷窃。因此,我们需要找到一个可行的解,使得偷窃的顺序不会触发警报,同时总金额最大化。
状态定义:用 dp[i]
表示前 i
个房屋能偷窃到的最大金额。
边界条件:
- 如果只有1个房屋,偷窃该房屋,可以偷窃到最高总金额。
- 如果只有2个房屋,偷窃其中金额较高的房屋。
状态转移:对于第 i
个房屋(i > 2
),我们有两种选择:
- 偷窃第
i
个房屋,则前i-1
个房屋中不能偷窃第i-1
个房屋,因此最大金额为dp[i-2] + nums[i]
。 - 不偷窃第
i
个房屋,最大金额为dp[i-1]
。
递推关系:dp[i] = max(dp[i-1], dp[i-2] + nums[i])
。
解决代码
class Solution { public int rob(int[] nums) { if (nums.length == 0) { return 0; } if (nums.length == 1) { return nums[0]; } int n = nums.length; int[] dp = new int[n]; dp[0] = nums[0]; dp[1] = Math.max(nums[0], nums[1]); for (int i = 2; i < n; i++) { dp[i] = Math.max(dp[i - 1], dp[i - 2] + nums[i]); } return dp[n - 1]; }}
代码解释
dp[0]
初始化为第一个房屋的金额,dp[1]
初始化为前两个房屋中金额较大的那个。dp[n-1]
即为前 n
个房屋能偷窃到的最大金额。这种方法通过动态规划有效地解决了问题,时间复杂度为 O(n),空间复杂度为 O(n)。
发表评论
最新留言
感谢大佬
[***.8.128.20]2025年05月03日 04时23分10秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Kubernetes实战(三)-定向调度(NodeSelector)
2025-04-03
Kubernetes实战(二十九)-集群资源管理(CPU & Memory)
2025-04-03
Kubernetes实战(二十二)-Etcd 集群部署(安全)
2025-04-03
Kubernetes实战(二十八)-环境共享与隔离(Namespace)
2025-04-03
Kubernetes实战(十五)-敏感数据管理(Secret)
2025-04-03
Kubernetes对接Ceph存储实现云原生持久化
2025-04-03
Kubernetes对象Service详解
2025-04-03
kubernetes常用工具
2025-04-03
Kubernetes快速上手:部署、使用及核心概念解析
2025-04-03
Kubernetes故障排查与面试汇总
2025-04-03
Kubernetes故障排查实战
2025-04-03
kubernetes混合云平台运维实战项目分享
2025-04-03
kubernetes社区项目生态概览
2025-04-03
Kubernetes网络插件使用详解
2025-04-03
Kubernetes调度单位Pod
2025-04-03
Kubernetes部署Dashboard实战
2025-04-03
Kubernetes集群升级实战
2025-04-03