Algorithms first
打家劫舍 · 交互式算法学习
不能偷相邻房屋,求最高金额。
#198 · 一维动态规划
打家劫舍
House Robber
nums = [2,7,9,3,1]状态流3 个关键状态
步骤 1处理 2,最优为 2。
dp=2状态 12
→状态 27
→状态 39
→状态 43
→状态 51
推荐
滚动动态规划
时间
O(n)空间 O(1)当前最优=max(不偷当前的前一最优, 偷当前+前两项最优)。
1function rob(a) {2 let prev2 = 0,3 prev1 = 0;4 for (const x of a)[prev2, prev1] = [prev1, Math.max(prev1, prev2 + x)];5 return prev1;6}多语言参考
来源 · CC BY-SA 4.0 ↗Java · C++ · Go
这是一组同题正确实现,独立于上方当前动画方法;不同语言可能采用另一种正确策略。
1class Solution {2 private Integer[] f;3 private int[] nums;4 5 public int rob(int[] nums) {6 this.nums = nums;7 f = new Integer[nums.length];8 return dfs(0);9 }10 11 private int dfs(int i) {12 if (i >= nums.length) {13 return 0;14 }15 if (f[i] == null) {16 f[i] = Math.max(nums[i] + dfs(i + 2), dfs(i + 1));17 }18 return f[i];19 }20}交互式算法学习
从执行步骤真正理解 LeetCode 经典 150
本站整理 150 道高频算法面试题和 302 种解法。动画方法同步展示 JavaScript 与 Python;每题另提供 Java、C++ 与 Go 同题参考实现。
AlgoViz Lab
打家劫舍 · 解法对比
不能偷相邻房屋,求最高金额。
- 测试用例
nums = [2,7,9,3,1]- 题目分类
- 一维动态规划
- 解法对比
- 2
递归选或不选
每间房选择跳过,或偷它并跳过下一间。
- 时间
O(2^n)- 空间
O(n)
滚动动态规划
当前最优=max(不偷当前的前一最优, 偷当前+前两项最优)。
- 时间
O(n)- 空间
O(1)