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 ...
随机推荐
- WEB API 系列(二) Filter的使用以及执行顺序
在WEB Api中,引入了面向切面编程(AOP)的思想,在某些特定的位置可以插入特定的Filter进行过程拦截处理.引入了这一机制可以更好地践行DRY(Don’t Repeat Yourself)思想 ...
- 运行python “没有那个文件或目录3” 或 “/usr/local/bin/python3^M: bad interpreter: 没有那个文件或目录” 错误
原因 如果使用的是#!/usr/local/bin/python3这种方式,就会出现 “/usr/local/bin/python3^M: bad interpreter: 没有那个文件或目录” 错误 ...
- kali虚拟机添加共享文件夹
1.保证安装了vmtools 2.在虚拟机本身设置共享文件夹,如图 其中选的这个文件夹就是宿主机里待共享的文件夹. 3,在kali里启用它: vmhgfs-fuse .host:[宿主机文件夹] /m ...
- vue ui 启动,浏览器报错Unexpected token <
可能的解决办法: 选择清空缓存并硬性重新加载页面. 如果不行,全局卸载@vue/cli,重新安装.
- git1使用步骤初始化拉取修改提交推送
Git 使用 git init 命令来初始化一个 Git 仓库,Git 的很多命令都需要在 Git 的仓库中运行,所以 git init 是使用 Git 的第一个命令. 在执行完成 git init ...
- oracle 游标分析与理解(基础)
--------------坚持写一点 慢慢成长 希望对大家有所帮助(小白的理解) 也是自己学习后的理解(只是一小部分,需要更深沉的还需日后成长) 接下来就是我们的重点 --游标 提供了一种对从表中 ...
- Asp.net core 学习笔记 Fluent Validation
之前就有在 .net 时代介绍过了. 这个 dll 也支持 .net core 而且一直有人维护. 对比 data annotation 的 validation, 我越来越觉得这个 fluent 好 ...
- 如何查看linux服务器内存使用情况
1. free命令 free 命令显示系统使用和空闲的内存情况,包括物理内存.交互区内存(swap)和内核缓冲区内存. 直接输入free命令,显示如下 free命令默认是显示单位kb,可以采用fr ...
- Venom- Eminem
I got a song filled with shit for the strong willed. 我写了一首充满戾气的歌献给意志坚强的人. When the world give you a ...
- Day 5内存管理,定义变量
昨日内容回顾 python的2种执行方式 交互式 写一句翻译一句 优点:能及时发现bug,及时调试 缺点:关即消失,不能保存 命令行式 优点:可以永久保存 缺点:无法及时看到结果 python3 c: ...