lintcode --打劫房屋II
2017-08-17 09:31
295 查看
在上次打劫完一条街道之后,窃贼又发现了一个新的可以打劫的地方,但这次所有的房子围成了一个圈,这就意味着第一间房子和最后一间房子是挨着的。每个房子都存放着特定金额的钱。你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,且 当相邻的两个房子同一天被打劫时,该系统会自动报警。
给定一个非负整数列表,表示每个房子中存放的钱, 算一算,如果今晚去打劫,你最多可以得到多少钱 在不触动报警装置的情况下。
注意事项
这题是House Robber的扩展,只不过是由直线变成了圈
您在真实的面试中是否遇到过这个题?
Yes
样例
给出nums =
/*
打劫房间I中下面定义的dp[i],表示打劫到第i个房间所能够获得0-i内的局部最大值
定义dp[i],表示当前所能获得的最大收获,这里的值最终就是最大值,数组dp的长度是len+1,第一个元素是0,dp[i]也可以理解为,不包含A[i]元素时所取得的最大值
dp[i] = Math.max(dp[i-1],dp[i-2]+A[i-1])
*/
/*
解题思路:和这个差不多,一样是动态规划。只不过圈起来了。
仅对最后一所房子进行讨论,
如果不打劫,和前一篇文章一样,此时结果为r1 = dp[nums.length - 1][0];
如果打劫,则意味着第一所房子不能打劫,即dp[0][0] = dp[0][1] = 0,这样重来一次动态规划,此时的结果为 r2 = dp[nums.length-1][1];
最终结果为max(r1, r2).
*/
public class Solution {
public int houseRobber2(int[] nums) {
// write your code here
if(nums==null||nums.length==0) return 0;
if(nums.length==1) return nums[0];
int[][] dp = new int[nums.length][2];
//不打劫最后一个,则第一个可以打劫
dp[0][1] = nums[0];
for(int
9822
i=1;i<nums.length ;++i){
dp[i][0] = Math.max(dp[i-1][1], dp[i-1][0]);
dp[i][1] = dp[i-1][0] + nums[i];
}
int r1 = dp[nums.length-1][0];
//如果打劫最后一个房子,则第一个不能打劫
dp[0][1] = 0;
for(int i=1;i<nums.length ;++i){
dp[i][0] = Math.max(dp[i-1][1], dp[i-1][0]);
dp[i][1] = dp[i-1][0] + nums[i];
}
int r2 = dp[nums.length-1][1];
return Math.max(r2, r1);
}
}
给定一个非负整数列表,表示每个房子中存放的钱, 算一算,如果今晚去打劫,你最多可以得到多少钱 在不触动报警装置的情况下。
注意事项
这题是House Robber的扩展,只不过是由直线变成了圈
您在真实的面试中是否遇到过这个题?
Yes
样例
给出nums =
[3,6,4], 返回
6, 你不能打劫
3和
4所在的房间,因为它们围成一个圈,是相邻的.
/*
打劫房间I中下面定义的dp[i],表示打劫到第i个房间所能够获得0-i内的局部最大值
定义dp[i],表示当前所能获得的最大收获,这里的值最终就是最大值,数组dp的长度是len+1,第一个元素是0,dp[i]也可以理解为,不包含A[i]元素时所取得的最大值
dp[i] = Math.max(dp[i-1],dp[i-2]+A[i-1])
*/
/*
解题思路:和这个差不多,一样是动态规划。只不过圈起来了。
仅对最后一所房子进行讨论,
如果不打劫,和前一篇文章一样,此时结果为r1 = dp[nums.length - 1][0];
如果打劫,则意味着第一所房子不能打劫,即dp[0][0] = dp[0][1] = 0,这样重来一次动态规划,此时的结果为 r2 = dp[nums.length-1][1];
最终结果为max(r1, r2).
*/
public class Solution {
public int houseRobber2(int[] nums) {
// write your code here
if(nums==null||nums.length==0) return 0;
if(nums.length==1) return nums[0];
int[][] dp = new int[nums.length][2];
//不打劫最后一个,则第一个可以打劫
dp[0][1] = nums[0];
for(int
9822
i=1;i<nums.length ;++i){
dp[i][0] = Math.max(dp[i-1][1], dp[i-1][0]);
dp[i][1] = dp[i-1][0] + nums[i];
}
int r1 = dp[nums.length-1][0];
//如果打劫最后一个房子,则第一个不能打劫
dp[0][1] = 0;
for(int i=1;i<nums.length ;++i){
dp[i][0] = Math.max(dp[i-1][1], dp[i-1][0]);
dp[i][1] = dp[i-1][0] + nums[i];
}
int r2 = dp[nums.length-1][1];
return Math.max(r2, r1);
}
}
相关文章推荐
- lintcode:打劫房屋II
- LintCode:打劫房屋 II
- MicroSoft/LintCode:M-打劫房屋 II
- lintcode刷题——打劫房屋
- LintCode:打劫房屋
- LintCode: 房屋染色 II
- Lintcode打劫房屋
- lintcode打劫房屋
- Lintcode--011(打劫房屋2)
- LintCode打劫房屋3(M)
- LINTCODE——房屋染色II
- lintcode 中等题:House Robber 打劫房屋
- Lintcode6——合并排序数组 II
- Lintcode 搜索二维矩阵 II
- LintCode做题记录-两数组的交 II
- LintCode 36 翻转链表 II
- lintcode&九章算法——101. 删除有序数组里的重复元素 II ? 待解决
- lintcode:Sort Colors II
- LintCode-数字组合 II
- LintCode-Sort Colors II