第198题:打家劫舍

一. 问题描述

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。

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

二. 解题思路

本题思路:采用动态规划的方法进行求解,找到动态转移函数f(n)=max(f(n-1)+m(n),f(n-2)+m(n)),其中f(n)代表前n个房屋所偷盗最大值,而m(n)代表第n个房屋的金额。

步骤一:根据状态转移函数times,创建一个数组存储每一次可能的最大值。

步骤二:遍历数组,通过动态转移函数,将每次的最大值计算出来,并将最终最大值存储到maxvalue中,最后输出maxvalue。

三. 执行结果

执行用时 :0 ms, 在所有 java 提交中击败了100.00%的用户

内存消耗 :34.3 MB, 在所有 java 提交中击败了85.14%的用户

四. Java代码

class Solution {
    public int rob(int[] nums) {
        if(nums.length<=0||nums==null) {
            return 0;
        }
        int []time=new int[nums.length];
        int maxvalue=0;
        for(int i=0;i<nums.length;i++) {
            if(i-2<0||i-3<0) {
                if(i-2<0) {
                    time[i]=nums[i];
                }else {
                    time[i]=time[i-2]+nums[i];
                }
                if(time[i]>maxvalue) {
                    maxvalue=time[i];
                }
              
            }else {
                time[i]=Math.max(time[i-2]+nums[i], time[i-3]+nums[i]);
                if(time[i]>maxvalue) {
                    maxvalue=time[i];
                }
                
            }
            
        }
        return maxvalue;
    }
}
原文地址:https://www.cnblogs.com/xiaobaidashu/p/12066543.html