题目

假设你是一个专业的窃贼,准备沿着一条街打劫房屋。每个房子都存放着特定金额的钱。你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,且 当相邻的两个房子同一天被打劫时,该系统会自动报警

给定一个非负整数列表,表示每个房子中存放的钱, 算一算,如果今晚去打劫,你最多可以得到多少钱 在不触动报警装置的情况下

样例

给定 [3, 8, 4], 返回 8.

挑战

O(n) 时间复杂度 且 O(1) 存储。

解题

定义dp[i]表示打劫第i个房间为止所获得的最大收益,而dp[i]的值只与dp[i-2] 和dp[i-3]有关 并且 dp[i] = A[i] + max(dp[i-2],dp[i-3])

当求解所有的A[i]后,需要对最后两个dp[len-1] dp[len-2] 取最大值作为最后的答案。参考链接

public class Solution {
/**
* @param A: An array of non-negative integers.
* return: The maximum amount of money you can rob tonight
*/
public long houseRobber(int[] A) {
// write your code here
int len = A.length;
// dp[i] 表达打劫i房间为止所活动的收获 ,与dp[i-2] dp[i-3]有关
if(len ==0)
return 0;
long dp[] = new long[len];
dp[0] = A[0];
if(len == 1){
return dp[0];
}else if(len == 2){
dp[1] = A[1];
return Math.max(dp[0],dp[1]);
}else if(len == 3){
dp[1] = A[1];
dp[2] = A[0] + A[2];
return Math.max(dp[1],dp[2]);
}
dp[1] = A[1];
dp[2] = A[0] + A[2];
for(int i = 3;i< len; i++){
dp[i] = A[i] + Math.max(dp[i-2],dp[i-3]);
}
return Math.max(dp[len-2],dp[len-1]);
}
}

Java Code

总耗时: 3790 ms

不用数组,更改后的程序如下

public class Solution {
/**
* @param A: An array of non-negative integers.
* return: The maximum amount of money you can rob tonight
*/
public long houseRobber(int[] A) {
// write your code here
int len = A.length;
if(len == 0)
return 0; if(len == 1)
return A[0];
if(len == 2)
return Math.max(A[0],A[1]);
if(len == 3)
return Math.max(A[1],A[0] + A[2]);
long max0 = 0;
long max1 = 0;
long max2 = 0;
long max3 = 0;
max1 = A[0];
max2 = A[1];
for(int i = 2;i< len ;i++){
max3 = A[i] + Math.max(max0,max1);
max0 = max1;
max1 = max2;
max2 = max3;
}
return Math.max(max3,max1);
}
}

Java Code

讲解

  i-3 i-2 i-1 i  
  max0 max1 max2 max3  

对第i处的最大值max3 = A[i] + max(max1,max0)

当是i+1个的时候,更新max0、max1、max2

max0 = max1

max1 = max2

max2 = max3

主要对前三个的A[i]需要进行单独处理。

写成Python

class Solution:
# @param A: a list of non-negative integers.
# return: an integer
def houseRobber(self, A):
# write your code here
lenA = len(A)
if A == []:
return 0
if lenA == 1:
return A[0]
if lenA == 2:
return max(A[0],A[1])
dp = [0]*lenA
dp[0] = A[0]
dp[1] = A[1]
dp[2] = A[2] + A[0]
for i in range(3,lenA):
dp[i] = A[i] + max(dp[i-2],dp[i-3])
return max(dp[lenA-1],dp[lenA-2])

Python Code

总耗时: 814 ms

网上看到,也可以这样定义dp[i],表示当前所能获得的最大收获,这里的值最终就是最大值,由于数组dp的长度是len+1,第一个元素是0,dp[i]也可以理解为,不包含A[i]元素时所取得的最大值。

public class Solution {
/**
* @param A: An array of non-negative integers.
* return: The maximum amount of money you can rob tonight
*/
public long houseRobber(int[] A) {
// write your code here
int len = A.length;
if(len == 0)
return 0;
long dp[] = new long[len+1];
dp[1] = A[0];
if(len == 1)
return dp[1];
for(int i= 2 ;i<= len ;i++){
dp[i] = Math.max(dp[i-1],dp[i-2] + A[i-1]);
}
return dp[len];
}
}

不要数组

public class Solution {
/**
* @param A: An array of non-negative integers.
* return: The maximum amount of money you can rob tonight
*/
public long houseRobber(int[] A) {
// write your code here
int len = A.length;
if(len == 0)
return 0;
long res1 = 0;
long res2 = A[0];
if( len == 1)
return res2;
for(int i=1;i<len ;i++){
long res3 = Math.max(res2,res1+A[i]);
res1 = res2;
res2 = res3;
}
return res2;
}
}

lintcode:打劫房屋的更多相关文章

  1. lintcode:打劫房屋 III

    题目 打劫房屋 III 在上次打劫完一条街道之后和一圈房屋之后,窃贼又发现了一个新的可以打劫的地方,但这次所有的房子组成的区域比较奇怪,聪明的窃贼考察地形之后,发现这次的地形是一颗二叉树.与前两次偷窃 ...

  2. lintcode:打劫房屋II

    题目 打劫房屋II 在上次打劫完一条街道之后,窃贼又发现了一个新的可以打劫的地方,但这次所有的房子围成了一个圈,这就意味着第一间房子和最后一间房子是挨着的.每个房子都存放着特定金额的钱.你面临的唯一约 ...

  3. 打劫房屋 · House Robber

    [抄题]: 假设你是一个专业的窃贼,准备沿着一条街打劫房屋.每个房子都存放着特定金额的钱.你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,且 当相邻的两个房子同一天被打劫时,该系统会自动报警 ...

  4. Lintcode--011(打劫房屋2)

    在上次打劫完一条街道之后,窃贼又发现了一个新的可以打劫的地方,但这次所有的房子围成了一个圈,这就意味着第一间房子和最后一间房子是挨着的.每个房子都存放着特定金额的钱.你面临的唯一约束条件是:相邻的房子 ...

  5. lintcode算法周竞赛

    ------------------------------------------------------------第七周:Follow up question 1,寻找峰值 寻找峰值 描述 笔记 ...

  6. lintcode-392-打劫房屋

    392-打劫房屋 假设你是一个专业的窃贼,准备沿着一条街打劫房屋.每个房子都存放着特定金额的钱.你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,且 当相邻的两个房子同一天被打劫时,该系统会自 ...

  7. 7九章算法强化班全解--------Hadoop跃爷Spark

    ------------------------------------------------------------第七周:Follow up question 1,寻找峰值 寻找峰值 描述 笔记 ...

  8. Java程序员秋招面经大合集(BAT美团网易小米华为中兴等)

    Cvte提前批 阿里内推 便利蜂内推 小米内推 金山wps内推 多益网络 拼多多学霸批 搜狗校招 涂鸦移动 中国电信it研发中心 中兴 华为 苏宁内推 美团内推 百度 腾讯 招商银行信用卡 招银网络科 ...

  9. 一个JAVA渣渣的校招成长记,附BAT美团网易等20家面经总结

    欢迎关注我的微信公众号:"Java面试通关手册"(坚持原创,分享美文,分享各种Java学习资源,面试题,以及企业级Java实战项目回复关键字免费领取): 今天分享一篇牛客网上的一个 ...

随机推荐

  1. [转]JSON与XML的区别比较

    1.定义介绍 (1).XML定义扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许 ...

  2. 【转载】ITU-RBT.656视频标准接口

    ITU-RBT.656视频标准接口 ITU-RBT.656视频标准接口PAL制式(720*576)每场由四部分组成. ● 有效视频数据,分为奇场和偶场,均由288行组成.每行有1440个字节,其中72 ...

  3. iOS 进阶 第十七天(0420)

    0420 凡是继承了UIResponder的类都可以做响应者 响应事件的传递是由底到高来传递,响应者链条是由高到底来响应 相应事件的传递(由底到高 找到正在和用户触摸交互的view) 准则:事件由父控 ...

  4. Liunx0000(初步认识)

    都要放假了,学习一下吧,毕竟还有课设,虽然我真的懒得看Linux,不想接触这破玩意!各应人的东西! 一.发展趋势 1\无操作系统阶段20s60 2\简单操作系统阶段 3\试试操作系统阶段 4\面向In ...

  5. color the python console text

    //install termcolor module cd \ cd python27 cd scripts pip install termcolor pip install colorama // ...

  6. 关于 Google Chrome 中的全屏模式和 APP 模式

    前言:我一直在纠结这篇文章是否应该归类在「前段开发」的范围内,哈哈! 前段时间做了一个项目,涉及到一个要全屏模式去访问网页的需求,因为 Google Chrome 的效率不错,而且专门为 Chrome ...

  7. TF/IDF(term frequency/inverse document frequency)

    TF/IDF(term frequency/inverse document frequency) 的概念被公认为信息检索中最重要的发明. 一. TF/IDF描述单个term与特定document的相 ...

  8. 如何不通过系统升级来安装window10正式版?(特别针对Xp用户)

    今天是个特殊的日子7/29,相信大家都等了很久了吧,win10正式版终于上线,一些不懂电脑的人只会通过360和腾讯管家等来升级到win10(XP用户除外),而对于大多数像我这样对系统比较热衷的人,我相 ...

  9. Careercup - Google面试题 - 4699414551592960

    2014-05-06 13:34 题目链接 原题: we have a random list of people. each person knows his own height and the ...

  10. windows下将多个文件里面的内容合并成一个一个文件

    如题:例如有多个章节的小说,现在要把他们合并成一个txt文件. 利用windows自带cmd工具: 一.拷贝合并1.将你的txt文档按照顺序分别命名为01.txt 02.txt 03.txt……2.将 ...