Skip to content

Commit e51ff89

Browse files
committed
add LeetCode 213. 打家劫舍 II
1 parent cdf41fe commit e51ff89

File tree

1 file changed

+90
-0
lines changed

1 file changed

+90
-0
lines changed

DP/LeetCode 213. 打家劫舍 II.md

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L2doL2Nob2NvbGF0ZTE5OTkvY2RuL2ltZy8yMDIwMDgyODE0NTUyMS5qcGc?x-oss-process=image/format,png)
2+
>仰望星空的人,不应该被嘲笑
3+
4+
## 题目描述
5+
你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
6+
7+
给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。
8+
9+
示例 1:
10+
11+
```javascript
12+
输入: [2,3,2]
13+
输出: 3
14+
解释: 你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻的。
15+
```
16+
17+
示例 2:
18+
19+
```javascript
20+
输入: [1,2,3,1]
21+
输出: 4
22+
解释: 你可以先偷窃 1 号房屋(金额 = 1),然后偷窃 3 号房屋(金额 = 3)。
23+
偷窃到的最高金额 = 1 + 3 = 4
24+
```
25+
26+
来源:力扣(LeetCode)
27+
链接:https://leetcode-cn.com/problems/house-robber-ii
28+
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
29+
30+
## 解题思路
31+
32+
这道题相比于198.打家劫舍 更有趣味一点,房子变成环状的了,那么我们就没办法同时取第一个房子和最后一个房子了,但是我们依然可以使用单向排列的代码,我们直接进行两次遍历不就好了吗,第一次遍历,我们不偷第一家房子,取得单向排列的最大值,第二次遍历,我们不偷最后一家房子,取得单向排列的最大值,那么最终结果就是这两个最大值中的最大值!
33+
34+
```javascript
35+
/**
36+
* @param {number[]} nums
37+
* @return {number}
38+
*/
39+
var rob = function (nums) {
40+
// 对于长度为 0 和 1进行特判一下
41+
if (nums.length === 0) return 0;
42+
if (nums.length === 1) return nums[0];
43+
let arr1 = nums.slice();
44+
arr1.shift();
45+
let arr2 = nums.slice();
46+
arr2.pop();
47+
// 求不偷第一家房子和不偷最后一家房子的单向排列的最大值
48+
return Math.max(oneRob(arr1), oneRob(arr2));
49+
}
50+
var oneRob = function (nums) {
51+
let n = nums.length;
52+
if (n === 0) return 0; // 长度为0 值为0
53+
if (n === 1) return nums[0]; // 长度为1,默认最多就当前值
54+
if (n === 2) return Math.max(nums[0], nums[1]); // 长度为2,由于不能相邻偷,就取最大
55+
let dp = [];
56+
dp[0] = nums[0];
57+
dp[1] = Math.max(nums[0], nums[1]);
58+
// 当前能够偷的金额总和,就看前一家房子的金额加上当前金额,与相邻房间比较
59+
for (let i = 2; i < n; i++) {
60+
dp[i] = Math.max(dp[i - 1], dp[i - 2] + nums[i]);
61+
}
62+
// 最后就看最后两间房子金额总和的最大值
63+
return Math.max(dp[n - 1], dp[n - 2]);
64+
};
65+
```
66+
67+
68+
69+
70+
## 最后
71+
文章产出不易,还望各位小伙伴们支持一波!
72+
73+
往期精选:
74+
75+
<a href="https://github.com/Chocolate1999/Front-end-learning-to-organize-notes">小狮子前端の笔记仓库</a>
76+
77+
<a href="https://github.com/Chocolate1999/leetcode-javascript">leetcode-javascript:LeetCode 力扣的 JavaScript 解题仓库,前端刷题路线(思维导图)</a>
78+
79+
小伙伴们可以在Issues中提交自己的解题代码,🤝 欢迎Contributing,可打卡刷题,Give a ⭐️ if this project helped you!
80+
81+
82+
<a href="https://yangchaoyi.vip/">访问超逸の博客</a>,方便小伙伴阅读玩耍~
83+
84+
![](https://img-blog.csdnimg.cn/2020090211491121.png#pic_center)
85+
86+
```javascript
87+
学如逆水行舟,不进则退
88+
```
89+
90+

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy