博客
关于我
LeetCode题解【打家劫舍】(中等难度)
阅读量:790 次
发布时间:2023-01-31

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

为了解决这个问题,我们需要找到一种方法,能够在一夜内偷窃到的最高金额,而不触动相邻房屋的警报系统。

方法思路

这个问题类似于经典的动态规划问题,可以使用动态规划的方法来解决。我们可以定义一个数组 dp,其中 dp[i] 表示到第 i 个房屋时能够偷到的最多金额。状态转移方程如下:

  • 如果我们不偷第 i 个房屋,那么 dp[i] 就等于 dp[i-1]
  • 如果我们偷第 i 个房屋,那么我们不能偷第 i-1 个房屋,这时 dp[i] 等于 dp[i-2] 加上当前房屋的金额。

状态转移方程可以表示为:[ dp[i] = \max(dp[i-1], dp[i-2] + nums[i]) ]

初始化时:

  • 当数组长度为 1 时,只能偷第一个房屋,即 dp[0] = nums[0]
  • 当数组长度为 2 时,只能选择偷前两栋房子的其中一栋,取较大的那个。

解决代码

class Solution {    public int rob(int[] nums) {        if (nums == null || nums.length == 0) {            return 0;        }        int n = nums.length;        if (n == 1) {            return nums[0];        }        int[] dp = new int[n];        dp[0] = nums[0];        dp[1] = Math.max(nums[0], nums[1]);        for (int i = 2; i < n; i++) {            dp[i] = Math.max(dp[i - 1], dp[i - 2] + nums[i]);        }        return dp[n - 1];    }}

代码解释

  • 输入检查:首先检查输入数组是否为空,如果为空则返回 0。
  • 边界处理:如果数组长度为 1,直接返回该单个元素的值。
  • 初始化 dp 数组dp[0] 初始化为第一个房屋的金额,dp[1] 初始化为前两个房屋金额的最大值。
  • 填充 dp 数组:从第三个房屋开始,依次计算每个房屋能偷到的最大金额,使用上述的状态转移方程。
  • 返回结果:最后返回 dp 数组的最后一个元素,即整个数组能偷到的最大金额。
  • 这种方法的时间复杂度为 O(n),空间复杂度为 O(n),适用于题目给定的约束条件。

    转载地址:http://frgyk.baihongyu.com/

    你可能感兴趣的文章
    LINQ to DB 开源项目教程
    查看>>
    Linq to Entities不识别方法
    查看>>
    linq to entity常用操作
    查看>>
    linq to js使用汇总
    查看>>
    Linq to object 技巧、用法集锦
    查看>>
    LINQ to Objects---立即执行的Enumerable类方法
    查看>>
    linq to sql 三层架构中使用CRUD操作
    查看>>
    LINQ to SQL系列三 使用DeferredLoadingEnabled,DataLoadOption指定加载选项
    查看>>
    LINQ Tutorial for Beginners
    查看>>
    Linq 分组(group by)求和(sum)并且按照分隔符(join)分割列数据
    查看>>
    Linq 合并多个查询条件
    查看>>
    LINQ 左连接, 右连接, 全连接扩展
    查看>>
    linQ 查询
    查看>>
    linq-ef中如何批量删除
    查看>>
    LINQ/EF/Lambda 比较字符串日期时间大小
    查看>>
    LinQ—Lambda表达式
    查看>>
    LINQ与EF的并发处理
    查看>>
    LINQ中的Func委托
    查看>>
    Linq中的group by多表多字段
    查看>>
    linq实现分页加组合查询
    查看>>