leetcode日记 HouseRobber I II
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的更多相关文章
- 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 ...
- LeetCode Single Number I / II / III
[1]LeetCode 136 Single Number 题意:奇数个数,其中除了一个数只出现一次外,其他数都是成对出现,比如1,2,2,3,3...,求出该单个数. 解法:容易想到异或的性质,两个 ...
- [array] leetcode - 40. Combination Sum II - Medium
leetcode - 40. Combination Sum II - Medium descrition Given a collection of candidate numbers (C) an ...
- LeetCode 137. Single Number II(只出现一次的数字 II)
LeetCode 137. Single Number II(只出现一次的数字 II)
- 2017/11/22 Leetcode 日记
2017/11/22 Leetcode 日记 136. Single Number Given an array of integers, every element appears twice ex ...
- 2017/11/21 Leetcode 日记
2017/11/21 Leetcode 日记 496. Next Greater Element I You are given two arrays (without duplicates) num ...
- 2017/11/13 Leetcode 日记
2017/11/13 Leetcode 日记 463. Island Perimeter You are given a map in form of a two-dimensional intege ...
- 2017/11/20 Leetcode 日记
2017/11/14 Leetcode 日记 442. Find All Duplicates in an Array Given an array of integers, 1 ≤ a[i] ≤ n ...
- 2017/11/9 Leetcode 日记
2017/11/9 Leetcode 日记 566. Reshape the Matrix In MATLAB, there is a very useful function called 'res ...
随机推荐
- Python_Runoob
python复合赋值 # Fibonacci series: 斐波纳契数列 # 两个元素的总和确定了下一个数 a, b = 0, 1 while b < 10: print(b) a, b = ...
- 雷林鹏分享:jQuery EasyUI 数据网格 - 动态改变列
jQuery EasyUI 数据网格 - 动态改变列 数据网格(DataGrid)列可以使用 'columns' 属性简单地定义.如果您想动态地改变列,那根本没有问题.为了改变列,您可以重新调用dat ...
- 自动车牌识别(ALPR)---https://blog.csdn.net/ELEVEN_ZOU/article/details/80893579
1.基本功能:从一张或者一系列的图片中提取车牌信息,比如车牌号码.车牌颜色等信息. 2.功能扩展:车型.车品牌.车牌类型等. 3.应用方向:电子交易系统(停车自动收费.收费站自动支付等).交通执法.交 ...
- redist命令操作(一)--键key,字符串String
1.Redis 字符串(String) 参考菜鸟教程:http://www.runoob.com/redis/redis-strings.html 设置指定key的值,如果原来有,覆盖 127.0.0 ...
- 九度1456胜利大逃亡【BFS】
时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:4432 解决:1616 题目描述: Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会.魔王住在一个城堡 ...
- webpack打包vue项目,资源路径如何从绝对路径改为相对路径?css中的图片资源如何修改配置?
资源相对引用路径 问题描述 一般情况下,通过webpack+vuecli默认打包的css.js等资源,路径都是绝对的. 但当部署到带有文件夹的项目中,这种绝对路径就会出现问题,因为把配置的static ...
- 每日算法---Two Sum
Given an array of integers, return indices of the two numbers such that they add up to a specific ta ...
- Android proguard混淆签名打包出现"android proguard failed to export application"解决方案
刚刚接触安卓,不是很熟悉.发现之前可以正常打包的项目出现添加混淆再进行打包签名的APK之后提示"android proguard failed to export application&q ...
- linux命令三剑客之一sed
a(a\或者a\\):在当前行后面加入一行文本sed '/^test/a---->this is a example2' example 在test开头的行下,添加一行新的文本“----> ...
- REST(Representational state transfer)的四个级别以及HATEOAS介绍
Rest RES(Representational state transfer):表现层状态转移.其实它省略了主语,「表现层」其实指的是「资源」的「表现层」,所以通俗来讲就是:资源在网络中以某种表现 ...