描述

在上次打劫完一条街道之后,窃贼又发现了一个新的可以打劫的地方,但这次所有的房子围成了一个圈,这就意味着第一间房子和最后一间房子是挨着的。每个房子都存放着特定金额的钱。你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,且 当相邻的两个房子同一天被打劫时,该系统会自动报警。

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

这题是House Robber的扩展,只不过是由直线变成了圈

您在真实的面试中是否遇到过这个题?
样例
样例1

输入: nums = [3,6,4]
输出: 6
样例2

输入: nums = [2,3,2,3]
输出: 6

思路:

动态规划求解
(1)不考虑第一间房子和最后一间房子是挨着的时
考虑前i项的结果dp[i]时,

dp[i]为到达第i个房间时,得到的最大收益,A为房间钱数组。

当i = 1, 返回dp[0] = A[0]

当i = 2, 返回dp[1] = max(A[0], A[1])

当i = 3, 分为偷3号房屋和不偷3号房屋,

偷的情况下, 2号房间就不能偷了,结果为A[2] + dp[0]

不偷的情况下,结果为dp[1]

所以返回dp[2] = max(dp[0] + A[2], dp[1])

以此类推,dp[i] = max(dp[i-2] + A[i], dp[i-1])
(2)考虑第一间房子和最后一间房子是挨着时

区别在于1号房屋和最后一号房屋只能二选一
即把1号房间舍弃,或者最后一号房间舍弃。在这两种情况下选最优。

class Solution:"""@param nums: An array of non-negative integers.@return: The maximum amount of money you can rob tonight"""def houseRobber(self, nums):# write your code hereif len(nums) == 1:return nums[0]return max(self.houseRobber2(nums[1:]), self.houseRobber2(nums[:-1]))def houseRobber2(self, nums):if len(nums) == 0:return 0dp = [0 for _ in nums]dp[0] = nums[0]for i in range(1, len(nums)):if i == 1:dp[i] = max(nums[0], nums[i])else:dp[i] = max(dp[i - 2] + nums[i], dp[i - 1])return dp[-1]c=Solution()
d=c.houseRobber([2,3,2,3])
print(d)

结果:6

Leetcode 534打劫房屋II python相关推荐

  1. LeetCode 392打劫房屋 python

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

  2. LeetCode 142. 环形链表 II - Python 快慢指针法+详解

    题目 142. 环形链表 II 难度中等761 给定一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的 ...

  3. LeetCode 213 House Robber II Python

    题意:你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金.这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的.同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的 ...

  4. LintCode刷题——打劫房屋I、II、III

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

  5. lintcode:打劫房屋 III

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

  6. Leetcode - Subsets I,II

    Leetcode - 078. Subsets 这道题重定义了什么叫可行解: 一般而言,可行解需要满足强约束性条件集,而本题的可行解就是单一弱约束性条件(distinct integers,只需要当前 ...

  7. LeetCode 75. Sort Colors (python一次遍历,模拟三路快排)

    LeetCode 75. Sort Colors (python一次遍历,模拟三路快排) 题目分析: 本题需要实现数字只包含0,1,2的排序,并且要求一次遍历. 由于只用把数字隔离开,很容易想到快排的 ...

  8. LeetCode 字符串简单部分 算法 python实现

    ''' #2018-06-02 June Saturday the 22 week, the 153 day SZ LeetCode 字符串简单部分 算法 python实现 https://leetc ...

  9. Leetcode - Permutations I,II

    Leetcode - 046 Permutations 全排列问题是回溯的典型例题: 1.可行解的组成形式是给定数组中的所有数的组合,故而大小上可以作为可行解判定条件 2.每次需要在剩下可被选中的集合 ...

最新文章

  1. java json数据输出,java服务器端输出JSON格式数据
  2. Silverlight教程第四部分:使用 Style 元素更好地封装观感 (木野狐译)
  3. hdu 3449 有依赖性的01背包
  4. MeteoInfoLab脚本示例:TRMM 3B43 HDF数据
  5. 解决VMWARE安装macos系统找不到虚拟磁盘问题
  6. 真诚推荐几个最值得关注的前端公众号
  7. Android数据存储之sharedpreferences与Content Provider
  8. BootStrap笔记-按钮相关
  9. 用虚拟机VMware安装雪豹提示:当前主机无法支持64位操作系统
  10. bzoj 3679: 数字之积
  11. 为什么会有jQuery、Dojo、Ext、Prototype、YUI、Zepto这么多JS包?
  12. 电脑网页长截图怎么弄的?电脑上怎么截图?
  13. 【JVM · 调优】监控及诊断工具
  14. 如何查看浏览器的DNS 缓存信息
  15. Leetcode——714. Best Time to Buy and Sell Stock with Transaction Fee
  16. virtualBox实现windows和Ubuntu之间的复制粘贴
  17. android自动照相机2.0,Koda相机app下载-Koda相机v2.0.12 安卓版-腾牛安卓网
  18. EDR端点检测与响应
  19. vscode编辑器搜索小技巧
  20. 海盗王GM工具箱 - 物品编辑器

热门文章

  1. 有关使用junit依赖出现@Before或者@Before注解不生效
  2. Mabtyis无侵入式编程
  3. 使用spring boot+shiro+jwt+mybatis-plus搭建项目框架
  4. PaddleOCR——DEMO
  5. BugKuCTF 加密 滴答~滴
  6. BugKuCTF 杂项 眼见非实(ISCCCTF)
  7. Little Sub and Applese
  8. Java多线程环境检测系统中是否存在死锁和死锁恢复代码示例
  9. hive.ql.exec.DDLTask. MetaException(message:java.io.IOException: Attempt to start meta tracker faile
  10. JavaWeb-综合案例(用户信息)-学习笔记05【分页查询功能】