File tree Expand file tree Collapse file tree 6 files changed +192
-0
lines changed Expand file tree Collapse file tree 6 files changed +192
-0
lines changed Original file line number Diff line number Diff line change 190
190
- [ 动态规划-概览] ( /算法分类/动态规划/动态规划.md )
191
191
- [ 斐波拉契数列] ( /算法分类/递归和循环/斐波拉契数列.md ) ⭐⭐
192
192
- [ 最小路径和] ( /算法分类/动态规划/最小路径和.md ) ⭐⭐⭐
193
+ - [ 打家劫舍] ( /算法分类/动态规划/打家劫舍.md ) ⭐⭐⭐
193
194
194
195
195
196
## 贪心算法
Original file line number Diff line number Diff line change @@ -109,6 +109,7 @@ module.exports = {
109
109
children : [
110
110
'/algorithm/动态规划/动态规划' ,
111
111
'/algorithm/动态规划/最小路径和' ,
112
+ '/algorithm/动态规划/打家劫舍' ,
112
113
]
113
114
} ,
114
115
{
Original file line number Diff line number Diff line change 66
66
- [ 动态规划-概览] ( ./动态规划/动态规划.md )
67
67
- [ 斐波拉契数列] ( ./递归和循环/斐波拉契数列.md ) ⭐⭐
68
68
- [ 最小路径和] ( ./动态规划/最小路径和.md ) ⭐⭐⭐
69
+ - [ 打家劫舍] ( ./动态规划/打家劫舍.md ) ⭐⭐⭐
69
70
70
71
71
72
## 贪心算法
Original file line number Diff line number Diff line change
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
+ ```
Original file line number Diff line number Diff line change
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
+ ```
Original file line number Diff line number Diff line change
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
+ ```
You can’t perform that action at this time.
0 commit comments