题目
你是一个专业的强盗,计划抢劫沿街的房屋。每间房都藏有一定的现金,阻止你抢劫他们的唯一的制约因素就是相邻的房屋有保安系统连接,如果两间相邻的房屋在同一晚上被闯入,它会自动联系警方。
给定一个代表每个房屋的金额的非负整数列表,确定你可以在没有提醒警方的情况下抢劫的最高金额。
分析
简单的动态规划问题,题目意思是计算数组中 不相邻数字最大之和。
比如 [ 1, 3, 4, 5, 3, 2 ] 应返回 10 , 3 + 5 + 2 = 10 。
n个房屋所能抢到的最大的金额 = max (n-1 个房屋所能抢到的最大金额 , n-2 个房屋所能抢到的最大金额+第n个房屋的金额),这样用一个数组来保存当前房屋能抢到的最大金额数。
拿上面的例子来继续看具体过程
[ 1, 3, 4, 5, 3, 2 ]
当前位置对应的最大数值为:
1 3 5 8 8 10
计算过程 : 数组第一个元素 所对应的最大值即自己本身 1; 第二个元素所对应的最大值为 max(1,3) = 3; 第三个元素所对应的最大值为max( 3 , 1+4 )= 5 ; 第四个元素所对应的最大值为 max( 5, 3+5 )= 8 ; 第五个元素所对应的最大值为max( 8 , 3+5)= 8; 第六个元素所对应的最大值为 max( 8,8+2)= 10。 所以 最后结果为 1。
嗯。。注意array[1]的数值 应该是max(nums[0],nums[1]) 而不是 nums[1],自己在写的时候犯了这个错,还一直找不出来。。。
代码
class Solution { public int rob(int[] nums) { if (nums.length == 0 || nums == null) return 0; if (nums.length == 1)return nums[0]; if (nums.length == 2) return nums[0]>nums[1] ? nums[0]:nums[1]; int[] array = new int[nums.length];//保存每个位置的可以抢到的最大的数 for (int i = 0; i < nums.length; i++) if (i == 0 ) array[0] = nums[0]; else if (i == 1 ) array[1] = Math.max(nums[0],nums[1]); else array[i] = Math.max(array[i-1], (array[i-2]+nums[i])); return array[nums.length-1]; } }