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}
多语言参考

Java · C++ · Go

来源 · CC BY-SA 4.0 ↗

这是一组同题正确实现,独立于上方当前动画方法;不同语言可能采用另一种正确策略。

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 同题参考实现。

多形态可视化数组、矩阵、DP 表、递归树、树图、链表、栈队列堆、区间和状态机按解法选择。
动画与代码同步当前状态、步骤说明、变量和代码高亮保持一一对应,可逐步播放和回退。
适合面试复习每种方案都给出思路、时间复杂度、空间复杂度、测试用例和 LeetCode 中文原题入口。
AlgoViz Lab

打家劫舍 · 解法对比

不能偷相邻房屋,求最高金额。

测试用例
nums = [2,7,9,3,1]
题目分类
一维动态规划
解法对比
2
方案 1

递归选或不选

每间房选择跳过,或偷它并跳过下一间。

时间
O(2^n)
空间
O(n)
方案 2

滚动动态规划

当前最优=max(不偷当前的前一最优, 偷当前+前两项最优)。

时间
O(n)
空间
O(1)