博客
关于我
leetcode191-打家劫舍
阅读量:791 次
发布时间:2023-01-31

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

为了解决这个问题,我们需要找到在不触动警报装置的情况下,一夜之内能够偷窃到的最高金额。这个问题可以通过动态规划来解决。

方法思路

我们可以通过动态规划的方法来解决这个问题。具体步骤如下:

  • 问题分析:每间相邻的房屋不能同时被偷窃。因此,我们需要找到一个可行的解,使得偷窃的顺序不会触发警报,同时总金额最大化。

  • 状态定义:用 dp[i] 表示前 i 个房屋能偷窃到的最大金额。

  • 边界条件

    • 如果只有1个房屋,偷窃该房屋,可以偷窃到最高总金额。
    • 如果只有2个房屋,偷窃其中金额较高的房屋。
  • 状态转移:对于第 i 个房屋(i > 2),我们有两种选择:

    • 偷窃第 i 个房屋,则前 i-1 个房屋中不能偷窃第 i-1 个房屋,因此最大金额为 dp[i-2] + nums[i]
    • 不偷窃第 i 个房屋,最大金额为 dp[i-1]
  • 递推关系dp[i] = max(dp[i-1], dp[i-2] + nums[i])

  • 解决代码

    class Solution {    public int rob(int[] nums) {        if (nums.length == 0) {            return 0;        }        if (nums.length == 1) {            return nums[0];        }        int n = nums.length;        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];    }}

    代码解释

  • 初始检查:检查输入数组的长度,处理边界情况。
  • 边界初始化dp[0] 初始化为第一个房屋的金额,dp[1] 初始化为前两个房屋中金额较大的那个。
  • 动态规划:从第三个房屋开始,依次计算每个房屋能偷窃到的最大金额。
  • 结果返回dp[n-1] 即为前 n 个房屋能偷窃到的最大金额。
  • 这种方法通过动态规划有效地解决了问题,时间复杂度为 O(n),空间复杂度为 O(n)。

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

    你可能感兴趣的文章
    CentOS 7 安装 postgreSQL 9.4
    查看>>
    CentOS 7 巨大变动之 systemd 取代 SysV的Init
    查看>>
    centos 7 静态IP,指定DNS
    查看>>
    flask框架高校竞赛信息管理系统(毕设源码+论文)
    查看>>
    flask框架魔方教学网站毕设源码+论文
    查看>>
    Flatterer: 快速JSON转换工具使用指南
    查看>>
    FLEX 4 :选择本地文件编辑
    查看>>
    Flex 与 spring mvc 整合 BlazeDB
    查看>>
    JAVA- 清除数组重复元素
    查看>>
    Java-笔记12
    查看>>
    java-设计模式-装饰器设计模式,代理设计模式和继承三种扩展方法的比较
    查看>>
    java.io.tmpdir
    查看>>
    java农副产品购物app的设计与开发(ssm)
    查看>>
    Java创建elasticsearch的model时,如何配置使用ik分词器?
    查看>>
    java加密解密
    查看>>
    Java反射
    查看>>
    java反射介绍
    查看>>
    Java反射代码编写
    查看>>
    JAVA反射机制
    查看>>
    JAVA反射机制
    查看>>