198-213. House RobberI&II

来源:互联网 发布:沈阳系统i5编程实例 编辑:程序博客网 时间:2024/06/01 08:24

小偷偷东西不能偷相邻的住宅,否则会报警 求所偷物品的最大值,数组nums里的值表示这个家庭的被偷的价值

递推关系:

max[i]=Math.max(max[i-1],max[i-2]+nums[i])


HouseRobberII;

  所偷的住宅是一个环形,故不能同时偷第一个家庭和最后一个家庭

分两种情况,偷第一个家庭不偷最后一个家庭,偷最后一个家庭不偷第一个家庭;

max1.length=max2.length=nums.length-1

max1[i]=Math.max(max[i-1],max[i-2]+nums[i]) 从第一个家庭开始计算截止到倒数第二个家庭

max2[i]=Math.max(max[i-1],max[i-2]+nums[i+1]) 从第二个家庭开始计算

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


0 0