返回轨道
算法 · 2026-05-14 · 20 阅读

P71 抢劫连排房子

算法 20 阅读

信号摘要

难度:Easy · 时长:06:34 · leetcode 198 · lintcode 392

P71 抢劫连排房子

未对外公开播放权限
点击查看说明

描述

这个题目说的是,有一个强盗要去抢一排连排房子,每个房子里放着正整数金额的钱,可以用一个整数数组来表示。这个强盗唯一的限制就是不能同时抢相邻的两个房子,那么请问,这个强盗最多可以抢到多少钱。

比如说,这排房子里放着的钱是整数数组 nums:

8, 1, 2, 9, 6

在不能抢相邻房子的情况下,最多可以抢到的钱是 17,就是抢 8 和 9 这两个数字对应的房子。

抢完 8 和 9 后,其它的房子就都不能抢了,因为都与这两所房子相邻。

而其它的抢劫组合也都没有 17 大,比如抢 8,2,6,这三个房子不相邻可以同时抢,但抢它们的话能抢到的钱只有 16,没有 17 大。

代码

public class AlgoCasts {

  // Time: O(n), Space: O(n)
  public int rob(int[] nums) {
    if (nums == null || nums.length == 0) return 0;
    if (nums.length == 1) return nums[0];
    int[] d = new int[nums.length];
    d[0] = nums[0]; d[1] = Math.max(nums[0], nums[1]);

    for (int i = 2; i < nums.length; ++i) {
      d[i] = Math.max(d[i-1], d[i-2]+nums[i]);
    }
    return d[nums.length-1];
  }

  // Time: O(n), Space: O(1)
  public int robO1(int[] nums) {
    if (nums == null || nums.length == 0) return 0;
    int prev2 = 0, prev1 = 0;

    for (int num : nums) {
      int cur = Math.max(prev1, prev2 + num);
      prev2 = prev1;
      prev1 = cur;
    }
    return prev1;
  }

}

📡 通讯频道