乐趣区

关于leetcode:leetcode-198-House-Robber-打家劫舍中等

一、题目粗心

标签: 动静布局

https://leetcode.cn/problems/house-robber

你是一个业余的小偷,打算偷窃沿街的屋宇。每间房内都藏有肯定的现金,影响你偷窃的惟一制约因素就是相邻的屋宇装有互相连通的防盗零碎,如果两间相邻的屋宇在同一早晨被小偷闯入,零碎会主动报警。

给定一个代表每个屋宇寄存金额的非负整数数组,计算你 不触动警报安装的状况下,一夜之内可能偷窃到的最高金额。

示例 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

    二、解题思路

    定义一个数组 dp,dp[i] 示意抢劫到第 i 个房子时,能够抢劫的最大数量。先找状态转移方程,思考 dp[i],此时能够抢劫的最大数量有两种可能,一种是咱们抉择不抢劫这个房子,此时累计的金额即为 dp[i-1];另一种是咱们抉择抢劫这个房子,那么此前累计的最大金额只能是 dp[i-2],因为咱们不可能抢劫第 i - 1 个房子,否则会触发警报机关。因而状态转移方程为 dp[i] = max(dp[i-1], nums[i-1] + dp[i-2])。

    三、解题办法

    3.1 Java 实现

    public class Solution {public int rob(int[] nums) {
          int pre2 = 0;
          int pre1 = 0;
          int cur = 0;
          for (int i = 0; i < nums.length; i++) {cur = Math.max(pre2 + nums[i], pre1);
              pre2 = pre1;
              pre1 = cur;
          }
          return cur;
      }
    }

    四、总结小记

  • 2022/6/16 动静布局,把转移方程找进去就解决一半了
退出移动版