Skip to content

Commit 8486d5c

Browse files
committed
🎉 add: 打家劫舍
1 parent 3c55804 commit 8486d5c

File tree

6 files changed

+192
-0
lines changed

6 files changed

+192
-0
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@
190190
- [动态规划-概览](/算法分类/动态规划/动态规划.md)
191191
- [斐波拉契数列](/算法分类/递归和循环/斐波拉契数列.md)⭐⭐
192192
- [最小路径和](/算法分类/动态规划/最小路径和.md)⭐⭐⭐
193+
- [打家劫舍](/算法分类/动态规划/打家劫舍.md)⭐⭐⭐
193194

194195

195196
## 贪心算法

docs/.vuepress/config.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ module.exports = {
109109
children: [
110110
'/algorithm/动态规划/动态规划',
111111
'/algorithm/动态规划/最小路径和',
112+
'/algorithm/动态规划/打家劫舍',
112113
]
113114
},
114115
{

docs/algorithm/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@
6666
- [动态规划-概览](./动态规划/动态规划.md)
6767
- [斐波拉契数列](./递归和循环/斐波拉契数列.md)⭐⭐
6868
- [最小路径和](./动态规划/最小路径和.md)⭐⭐⭐
69+
- [打家劫舍](./动态规划/打家劫舍.md)⭐⭐⭐
6970

7071

7172
## 贪心算法
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
---
2+
{
3+
"title": "打家劫舍",
4+
}
5+
---
6+
7+
## 题目
8+
9+
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
10+
11+
给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。
12+
13+
```js
14+
示例 1:
15+
16+
输入: [1,2,3,1]
17+
输出: 4
18+
解释: 偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。
19+
  偷窃到的最高金额 = 1 + 3 = 4
20+
21+
```
22+
23+
```js
24+
示例 2:
25+
26+
输入: [2,7,9,3,1]
27+
输出: 12
28+
解释: 偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。
29+
  偷窃到的最高金额 = 2 + 9 + 1 = 12
30+
```
31+
32+
## 思路
33+
34+
考虑所有可能的抢劫方案过于困难。一个自然而然的想法是首先从最简单的情况开始。记:
35+
36+
`f(k)` = 从前 k 个房屋中能抢劫到的最大数额,`Ai` = 第 i 个房屋的钱数。
37+
38+
首先看` n = 1` 的情况,显然 `f(1) = A1`
39+
40+
再看 `n = 2``f(2) = max(A1, A2)`
41+
42+
对于 `n = 3`,有两个选项:
43+
44+
抢第三个房子,将数额与第一个房子相加。
45+
46+
不抢第三个房子,保持现有最大数额。
47+
48+
显然,你想选择数额更大的选项。于是,可以总结出公式:
49+
50+
`f(k) = max(f(k – 2) + Ak, f(k – 1))`
51+
52+
## 代码
53+
54+
55+
```js
56+
var rob = function (nums) {
57+
var len = nums.length;
58+
if (len < 2) {
59+
return nums[len - 1] ? nums[len - 1] : 0;
60+
}
61+
var current = [nums[0], Math.max(nums[0], nums[1])];
62+
for (var k = 2; k < len; k++) {
63+
current[k] = Math.max(current[k - 2] + nums[k], current[k - 1]);
64+
}
65+
return current[len - 1];
66+
};
67+
```

leetcode/198.打家劫舍.md

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
## 题目
2+
3+
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
4+
5+
给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。
6+
7+
```js
8+
示例 1:
9+
10+
输入: [1,2,3,1]
11+
输出: 4
12+
解释: 偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。
13+
  偷窃到的最高金额 = 1 + 3 = 4
14+
15+
```
16+
17+
```js
18+
示例 2:
19+
20+
输入: [2,7,9,3,1]
21+
输出: 12
22+
解释: 偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。
23+
  偷窃到的最高金额 = 2 + 9 + 1 = 12
24+
```
25+
26+
## 思路
27+
28+
考虑所有可能的抢劫方案过于困难。一个自然而然的想法是首先从最简单的情况开始。记:
29+
30+
`f(k)` = 从前 k 个房屋中能抢劫到的最大数额,`Ai` = 第 i 个房屋的钱数。
31+
32+
首先看` n = 1` 的情况,显然 `f(1) = A1`
33+
34+
再看 `n = 2``f(2) = max(A1, A2)`
35+
36+
对于 `n = 3`,有两个选项:
37+
38+
抢第三个房子,将数额与第一个房子相加。
39+
40+
不抢第三个房子,保持现有最大数额。
41+
42+
显然,你想选择数额更大的选项。于是,可以总结出公式:
43+
44+
`f(k) = max(f(k – 2) + Ak, f(k – 1))`
45+
46+
## 代码
47+
48+
49+
```js
50+
var rob = function (nums) {
51+
var len = nums.length;
52+
if (len < 2) {
53+
return nums[len - 1] ? nums[len - 1] : 0;
54+
}
55+
var current = [nums[0], Math.max(nums[0], nums[1])];
56+
for (var k = 2; k < len; k++) {
57+
current[k] = Math.max(current[k - 2] + nums[k], current[k - 1]);
58+
}
59+
return current[len - 1];
60+
};
61+
```
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
## 题目
2+
3+
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
4+
5+
给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。
6+
7+
```js
8+
示例 1:
9+
10+
输入: [1,2,3,1]
11+
输出: 4
12+
解释: 偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。
13+
  偷窃到的最高金额 = 1 + 3 = 4
14+
15+
```
16+
17+
```js
18+
示例 2:
19+
20+
输入: [2,7,9,3,1]
21+
输出: 12
22+
解释: 偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。
23+
  偷窃到的最高金额 = 2 + 9 + 1 = 12
24+
```
25+
26+
## 思路
27+
28+
考虑所有可能的抢劫方案过于困难。一个自然而然的想法是首先从最简单的情况开始。记:
29+
30+
`f(k)` = 从前 k 个房屋中能抢劫到的最大数额,`Ai` = 第 i 个房屋的钱数。
31+
32+
首先看` n = 1` 的情况,显然 `f(1) = A1`
33+
34+
再看 `n = 2``f(2) = max(A1, A2)`
35+
36+
对于 `n = 3`,有两个选项:
37+
38+
抢第三个房子,将数额与第一个房子相加。
39+
40+
不抢第三个房子,保持现有最大数额。
41+
42+
显然,你想选择数额更大的选项。于是,可以总结出公式:
43+
44+
`f(k) = max(f(k – 2) + Ak, f(k – 1))`
45+
46+
## 代码
47+
48+
49+
```js
50+
var rob = function (nums) {
51+
var len = nums.length;
52+
if (len < 2) {
53+
return nums[len - 1] ? nums[len - 1] : 0;
54+
}
55+
var current = [nums[0], Math.max(nums[0], nums[1])];
56+
for (var k = 2; k < len; k++) {
57+
current[k] = Math.max(current[k - 2] + nums[k], current[k - 1]);
58+
}
59+
return current[len - 1];
60+
};
61+
```

0 commit comments

Comments
 (0)