Leetcode--213. 打家劫舍Ⅱ
发布日期:2021-04-30 21:01:45 浏览次数:108 分类:精选文章

本文共 1509 字,大约阅读时间需要 5 分钟。

为了解决这个问题,我们需要在不触动警报装置的情况下,偷窃沿街房屋中的现金。房屋围成一圈,相邻房屋之间有防盗系统,如果同时被偷会报警。我们需要找到偷窃的最大金额。

方法思路

这个问题可以通过动态规划来解决。我们需要考虑两种情况:

  • 不偷第一个房屋,这样我们可以从第二个房屋开始偷,直到最后一个房屋。
  • 不偷最后一个房屋,这样我们可以从第一个房屋开始偷,直到倒数第二个房屋。
  • 对于每种情况,我们使用动态规划来计算最大金额。动态规划的方法是从当前房屋的最大金额和前一房屋的最大金额中选择较大的那个,以确保不触动报警装置。

    解决代码

    public class Solution213 {    public static int rob(int[] nums) {        int n = nums.length;        if (n == 0) return 0;        if (n == 1) return nums[0];        if (n == 2) return Math.max(nums[0], nums[1]);        int max1 = 0;        int current1 = nums[1];        int prev1 = 0;        max1 = current1;        for (int i = 2; i < n - 1; i++) {            int temp = Math.max(current1, prev1 + nums[i]);            prev1 = current1;            current1 = temp;            if (current1 > max1) {                max1 = current1;            }        }        int max2 = 0;        int current2 = nums[n - 2];        int prev2 = 0;        max2 = current2;        for (int i = n - 3; i >= 0; i--) {            int temp = Math.max(current2, prev2 + nums[i]);            prev2 = current2;            current2 = temp;            if (current2 > max2) {                max2 = current2;            }        }        return Math.max(max1, max2);    }    public static void main(String[] args) {        int[] nums = {4, 1, 2};        System.out.println(rob(nums));    }}

    代码解释

  • 边界条件处理:处理数组长度为0、1、2的情况,分别返回相应结果。
  • 情况一:房子0不被偷,计算房子1到房子n-1的最大金额。
  • 情况二:房子n-1不被偷,计算房子0到房子n-2的最大金额。
  • 动态规划计算:分别使用动态规划方法计算两种情况的最大金额。
  • 结果比较:返回两种情况中的最大值作为最终结果。
  • 这种方法确保了我们能够在不触动报警装置的情况下,偷窃到最多的金额。

    上一篇:牛客网--19校招--俄罗斯方块
    下一篇:JVM学习笔记004:内存模型JMM

    发表评论

    最新留言

    关注你微信了!
    [***.104.42.241]2026年06月12日 11时55分01秒