House Robber I

You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed, the only constraint stopping you from robbing each of them is that adjacent houses have security system connected and it will automatically contact the police if two adjacent houses were broken into on the same night.

Given a list of non-negative integers representing the amount of money of each house, determine the maximum amount of money you can rob tonight without alerting the police.

大意:你是一个专业盗贼,将要抢劫一条街上的房子,每个房子都有一定的钱可以抢,唯一能阻止你抢劫的是警报器,如果相邻的两个房子被抢,那么警报器就会触发。

现在给你一个非负的数组代表每个房子的金额,求出如何能够抢劫到最大数额的钱而不触发警报。

分析:不知道为什么,看到这个题很明显的就可以向动态规划上靠,感觉很像上楼梯和斐波那契数列那种,因此就向这个方向想想,假设数组有五个元素,那么对于能够抢到的最多的钱,一定是  第五个元素的金额加上前三个元素组成的数列所求的结果 与 前四个元素所组成元素所求结果  这两个结果中比较大的那个,那么这样子5个元素数列问题就转化成 4个元素数列问题和3个元素数列问题。以此类推,只要知道一个元素数列问题的结果和两个元素数列问题的结构就可以依次推出之后的结果。复杂度:时间上,线形时间内完成,只需要遍历一次。空间上,线形空间内完成,只需要额外的一个和原数组大小相同的数组。

class Solution(object):
def rob(self, nums):
lens=len(nums)
if lens==0:
return 0
if lens==1:
return nums[0]
if lens==2:
return max(nums)
result=[]
result.append(nums[0])
result.append(max(nums[:2]))
for i in xrange(2,lens):
tem=max(result[i-1],result[i-2]+nums[i])
result.append(tem)
return result[-1]

House Robber II

Note: This is an extension of House Robber.

After robbing those houses on that street, the thief has found himself a new place for his thievery so that he will not get too much attention. This time, all houses at this place are arranged in a circle. That means the first house is the neighbor of the last one. Meanwhile, the security system for these houses remain the same as for those in the previous street.

Given a list of non-negative integers representing the amount of money of each house, determine the maximum amount of money you can rob tonight without alerting the police.

大意:这是上一题的扩展

这一次街道变成环状街道,警报触发模式一样,这一次怎样抢劫到最多的钱。

分析:最直接的思路为将这个环形街道变成线形街道,这样就可以使用上一题的模式进行解答。根据此思路进行分析,同样假设5个元素,同样如果要抢到最多的钱,那么一定是 第五个元素加上二三元素(第一第四元素相邻第五元素,因此除去)组成的数列问题的结果 与 前四元素组成的数列问题的结果 这两结果中比较大的即为答案。那么这样就将原本的环形问题转化为两个线形问题。这样即可得到答案。复杂度:将一个环形问题拆成两个线形问题,因此时间上复杂度为O(2n),依然是线性时间,空间上重用同一条数组的话依然只需要O(n)的空间。

class Solution(object):
def rob1(self,nums):#House Robber I的解法
lens=len(nums)
if lens==0:
return 0
if lens==1:
return nums[0]
if lens==2:
return max(nums)
result=[]
result.append(nums[0])
result.append(max(nums[:2]))
for i in xrange(2,lens):
tem=max(result[i-1],result[i-2]+nums[i])
result.append(tem)
return result[-1] def rob(self,nums):
lens=len(nums)
if lens==1 or lens ==3 or len==2:
return max(nums)
if lens==0:
return 0
line1=nums[:lens-1]
line2=line1[1:lens-2]
tem1=self.rob1(line1)
tem2=self.rob1(line2)
return max(tem1,nums[-1]+tem2)

leetcode日记 HouseRobber I II的更多相关文章

  1. python leetcode 日记 --Contains Duplicate II --219

    题目: Given an array of integers and an integer k, find out whether there are two distinct indices i a ...

  2. LeetCode Single Number I / II / III

    [1]LeetCode 136 Single Number 题意:奇数个数,其中除了一个数只出现一次外,其他数都是成对出现,比如1,2,2,3,3...,求出该单个数. 解法:容易想到异或的性质,两个 ...

  3. [array] leetcode - 40. Combination Sum II - Medium

    leetcode - 40. Combination Sum II - Medium descrition Given a collection of candidate numbers (C) an ...

  4. LeetCode 137. Single Number II(只出现一次的数字 II)

    LeetCode 137. Single Number II(只出现一次的数字 II)

  5. 2017/11/22 Leetcode 日记

    2017/11/22 Leetcode 日记 136. Single Number Given an array of integers, every element appears twice ex ...

  6. 2017/11/21 Leetcode 日记

    2017/11/21 Leetcode 日记 496. Next Greater Element I You are given two arrays (without duplicates) num ...

  7. 2017/11/13 Leetcode 日记

    2017/11/13 Leetcode 日记 463. Island Perimeter You are given a map in form of a two-dimensional intege ...

  8. 2017/11/20 Leetcode 日记

    2017/11/14 Leetcode 日记 442. Find All Duplicates in an Array Given an array of integers, 1 ≤ a[i] ≤ n ...

  9. 2017/11/9 Leetcode 日记

    2017/11/9 Leetcode 日记 566. Reshape the Matrix In MATLAB, there is a very useful function called 'res ...

随机推荐

  1. SpringAOP的xml实例、注解形式实例、概念理解 以及execution表达式实例与概念说明

    (1)Spring AOP的简单应用: -->AOP:(Aspect Orinted Programming)面向切面编程,用于具有横切逻辑的场合,如:访问控制,事务管理,性能检测,由切入点和增 ...

  2. firefox(火狐)下 js中设置checkbox属性checked="checked"已有,但复选框却不显示勾选的原因

    刚看到问题时以为是浏览器兼容性的原因,ie.google都能正常显示. 网上查询之后发现是jQuery的attr()方法用的不恰当. jQuery1.6之前使用attr()可以修改 ,从jQuery ...

  3. node中间层实现文件上传

    一般情况下,前端的文件上传一般都是通过form表单的(<input type="file" />)来完成文件的上传,如果使用node中间层完成跨域,文件的上传就需要在n ...

  4. Python3环境搭建

    Python3环境搭建   Windows系统下安装Python3 Python3 下载 Python3 最新源码,二进制文档,新闻资讯等可以在 Python 的官网查看到: Python 官网:ht ...

  5. nc(NetCat)命令

    瑞士军刀netcat官网:http://netcat.sourceforge.net/ 安装:yum install -y nc查询:rpm -q nc 语法:nc [-hlnruz][-g<网 ...

  6. 保密数据!泽宝曝光各个主要店铺收入 核心SKU数量少得惊人

    今年跨境电商圈的一大并购,上市公司星徽精密并购知名跨境电商大卖家泽宝股份正在进程中.星徽精密在向证监会行政许可项目审查回复中,披露了泽宝股份众多保密数据,揭开了泽宝股份众多经营关键点,值得跨境电商卖家 ...

  7. js用解构来定义变量并赋值

    解构数组 var [a,b]=[1,2]; a //1 b //2 ------------- var [a,b]=[1,2,3,4]; a //1 b //2 ---------------- va ...

  8. Confluence 6 超过当前许可证期限进行升级

    这个页面将会对你在进行 Confluence 升级的时候超过了当前许可证的期限进行升级的情况. 许可证警告 在升级的过程中,你将会在 Confluence 的应用程序日志(log file)中看到类似 ...

  9. spring cloud(五)熔断监控Hystrix Dashboard和Turbine

    Hystrix-dashboard是一款针对Hystrix进行实时监控的工具,通过Hystrix Dashboard我们可以在直观地看到各Hystrix Command的请求响应时间, 请求成功率等数 ...

  10. 关于footer 小于一屏还要在底部显示的思考

    首先想到了页面是动态的  就是js 计算 但是有一个简单的方法就是 运用定位 1 footer 的祖先元素没有定位属性 absoulite (这样他就会相对于文档定位) left:0 bottom : ...