题目描述(LeetCode)

你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。

示例 1:

输入: [,,]
输出:
解释: 你不能先偷窃 号房屋(金额 = ),然后偷窃 号房屋(金额 = ), 因为他们是相邻的。

示例 2:

输入: [,,,]
输出:
解释: 你可以先偷窃 号房屋(金额 = ),然后偷窃 号房屋(金额 = )。
  偷窃到的最高金额 = + = 。

题目讲解

打家劫舍 II 和 打家劫舍 相比,题目只有一个变化。
这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的。
这个规则会带来怎样的影响呢?
如果按照原来的解法,最要命的问题就是无法确定是否即抢了第一家又抢了最后一家。
那么,要怎么保证抢了第一家就不抢最后一家呢?

对于上面我们可以采取拆解的方式,变为两个打家劫舍I的方式,如下:

相比于第一题,此题目将首位也作为相邻,假设总共有N个房子,思路是:
1.分两次求解,首先是第一家到第N-1家,求得偷得最多的值,记Max01;
2.之后再次求得第2家到第N家可以偷的最大值,记为Max02;
3.最后比较Max01与Max02,将最大的那个值返回。

题目代码

对于上面的逻辑,用swift代码如下:

import UIKit

let numsay: [Int] = [,,,,]
func robs(nums: [Int]) -> Int {
if nums.count == {
return
}
if nums.count == {
return nums[]
}
if nums.count == {
if nums[] < nums[] {
return nums[]
} else {
return nums[]
}
}
var dp1 = [Int]()
var dp2: [Int] = []
/**
*偷第一家与不偷第一家
*/
var fk_1: Int =
var fk_2: Int =
//偷第一家
dp1.append(nums[])
if dp1[] < nums[] {
dp1.append(nums[])
} else {
dp1.append(dp1[])
}
for i in ..<nums.count - {
if i >= {
fk_1 = dp1[i - ]
fk_2 = dp1[i - ] + nums[i]
let temp = fk_1 > fk_2 ? fk_1 : fk_2
dp1.append(temp)
}
} //不偷第一家,可以偷最后一家
dp2.append(nums[])
if dp2[] < nums[] {
dp2.append(nums[])
} else {
dp2.append(dp2[])
}
for i in ..<nums.count {
if i >= {
let fk_1 = dp2[i - ]
let fk_2 = dp2[i - ] + nums[i]
let temp = fk_1 > fk_2 ? fk_1 : fk_2
dp2.append(temp)
}
}
//比较大小
let maxRobs = dp1[dp1.count - ] > dp2[dp2.count - ] ? dp1[dp1.count - ] : dp2[dp2.count - ]
return maxRobs
} let maxRobs = robs(nums: numsay)
print(maxRobs)

通过playground打印出结果如下:

直接拷贝上面代码即可!

上面就是打家劫舍II的版本,希望对大家理解有所帮助,看完麻烦点个赞呗,谢谢!

打家劫舍II的更多相关文章

  1. LeetCode 198. 打家劫舍(House Robber)LeetCode 213. 打家劫舍 II(House Robber II)

    打家劫舍 题目描述 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报 ...

  2. Java实现 LeetCode 213 打家劫舍 II(二)

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

  3. 刷题-力扣-213. 打家劫舍 II

    213. 打家劫舍 II 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/house-robber-ii/ 著作权归领扣网络所有.商业 ...

  4. 213 House Robber II 打家劫舍 II

    注意事项: 这是 打家劫舍 的延伸.在上次盗窃完一条街道之后,窃贼又转到了一个新的地方,这样他就不会引起太多注意.这一次,这个地方的所有房屋都围成一圈.这意味着第一个房子是最后一个是紧挨着的.同时,这 ...

  5. [LeetCode] 198. 打家劫舍II ☆☆☆(动态规划)

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

  6. [LeetCode] 213. House Robber II 打家劫舍 II

    Note: This is an extension of House Robber. After robbing those houses on that street, the thief has ...

  7. [LeetCode] 213. 打家劫舍 II

    题目链接:https://leetcode-cn.com/problems/house-robber-ii/ 题目描述: 你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金.这个地方所有 ...

  8. Leetcode(213)-打家劫舍II

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

  9. [Swift]LeetCode213. 打家劫舍 II | House Robber II

    You are a professional robber planning to rob houses along a street. Each house has a certain amount ...

随机推荐

  1. PHP入门之调试

    环境 开发工具VSCode 2019 代码库 自建git 仓库 win7集成环境 PHPStudy2018  具体设置信息:   PHP 5.4.45 ,MySql 5.7 , Apache 2.4 ...

  2. 模拟26A 题解

    A. marshland 考试时想到了网络流,然而不会建图,就死了. 正解是最大费用可行流. 比较容易想到的是将每个点拆为两个点, s连没有危险值的入点, 没有危险值的入点连有危险值的入点,入点出点之 ...

  3. 二叉树 B-树B+树

    聚集索引和非聚集索引结构参考:http://blog.csdn.net/cangchen/article/details/44818623 前两天有位朋友邀请我回答个问题,为什么 MongoDB (索 ...

  4. ubuntu之路——day17.1 用np.pad做padding

    网上对np.pad的解释很玄乎,举的例子也不够直观,看了更晕了,对于CNN的填充请参考下面就够用了: np.pad的参数依次是目标数组,多增加的维数可以理解为一张图的前后左右增加几圈,设置为'cons ...

  5. python mysql数据库压力测试

    python mysql数据库压力测试 pymysql 的执行时间对比 1,装饰器,计算插入1000条数据需要的时间 def timer(func): def decor(*args): start_ ...

  6. 考勤打卡机导出的excel考勤时间表如何生成实用的考勤表

    该excel表有如下结构 姓名\日期 周1 周2 周3 周4 周5 张三 7:3518:02 7:3518:02 7:46   17:56 李四 7:3518:02 7:02 18:00 18:02 ...

  7. C# Area区域配置,修改默认路由

    1.右键项目新建文件夹 Areas 2.先把项目分类包好,建两个文件夹,放Controller和View,Model也可以放在这里 因为项目启动默认打开的是Home/Index ,我把它放在了Webs ...

  8. 面试突击(五)——Java常用集合

    为了勾起回忆,我画了一个常用集合类的结构关系图,话不多说,详见下图: 实际开发中ArrayList/HashMap/HashSet是三种最常用的集合工具类,通过其结构关系图也能清晰的了解他们的特性,所 ...

  9. angular的路由例子

    app.routing.module.ts里面,关键部分 const routes: Routes = [ { path: '', redirectTo : 'c3/c2/mmc', pathMatc ...

  10. win10系统许可证即将过期的解决方法

    相信很多朋友在使用win10系统过程中,都遇到过系统提示windows许可证即将过期的问题,win10系统许可证即将过期怎么办?我们只需要重新激活即可.以下方法可以参考,不足之处多多指正!   工具/ ...