欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

leetcode198打家劫舍java题解(动态规划)

程序员文章站 2022-03-28 13:48:37
...

1.题目
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。
示例 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 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/house-robber
2.想法
利用0-1背包问题,首先考虑特殊情况,数组内容为空和数组中只有一个数字,一个返回0一个返回第一个数字。利用全局最优化,依次比较选与不选的最大最小,若选择该数则跳过相邻值,继续计算;若不选择该数则选择相邻值继续计算。最终返回结果数组的最后一个数即为结果。
3.图解
leetcode198打家劫舍java题解(动态规划)
有兴趣的话可以看一下B站灯笼大神的视频,这里给个链接
4.自己题解

class Solution {
    public int rob(int[] nums) {
        if(nums.length==0)return 0;
        if(nums.length==1)return nums[0];
        int result[]=new int[nums.length];
        result[0]=nums[0];
    result[1]=Math.max(nums[0],nums[1]);
    for(int i=2;i<result.length;i++)
    {
        result[i]=Math.max(result[i-1],result[i-2]+nums[i]);
    }
    //System.out.print(Arrays.toString(result));
    return result[result.length-1];
}
}

5.动态规划问题
(1)0-1背包问题
0-1背包问题指的是每个物品只能使用一次。
(2)点解
可以查看一下dd大牛的背包九讲以及B站灯笼大神的动态规划讲解
6.效率
leetcode198打家劫舍java题解(动态规划)