File tree Expand file tree Collapse file tree 1 file changed +60
-0
lines changed Expand file tree Collapse file tree 1 file changed +60
-0
lines changed Original file line number Diff line number Diff line change
1
+ #### 198. 打家劫舍
2
+
3
+ 难度:中等
4
+
5
+ ---
6
+
7
+ 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统, ** 如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警** 。
8
+
9
+ 给定一个代表每个房屋存放金额的非负整数数组,计算你 ** 不触动警报装置的情况下** ,一夜之内能够偷窃到的最高金额。
10
+
11
+ ** 示例 1:**
12
+
13
+ ```
14
+ 输入:[1,2,3,1]
15
+ 输出:4
16
+ 解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。
17
+ 偷窃到的最高金额 = 1 + 3 = 4 。
18
+ ```
19
+
20
+ ** 示例 2:**
21
+
22
+ ```
23
+ 输入:[2,7,9,3,1]
24
+ 输出:12
25
+ 解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。
26
+ 偷窃到的最高金额 = 2 + 9 + 1 = 12 。
27
+ ```
28
+
29
+ ** 提示:**
30
+
31
+ * ` 1 <= nums.length <= 100 `
32
+ * ` 0 <= nums[i] <= 400 `
33
+
34
+ ---
35
+
36
+ 动态规划:
37
+
38
+ 子问题:偷** 前 ` k ` 个房子** 的最大金额。
39
+
40
+ 状态转移方程:
41
+ $$
42
+ dp[i] = max(dp[i - 1], dp[i - 2] + nums[i])
43
+ $$
44
+
45
+
46
+ ``` Java
47
+ class Solution {
48
+ public int rob (int [] nums ) {
49
+ int n = nums. length;
50
+ if (n == 1 ) return nums[0 ];
51
+ int [] dp = new int [n];
52
+ dp[0 ] = nums[0 ];
53
+ dp[1 ] = Math . max(nums[0 ], nums[1 ]);
54
+ for (int i = 2 ; i < n; i++ ){
55
+ dp[i] = Math . max(dp[i - 1 ], dp[i - 2 ] + nums[i]);
56
+ }
57
+ return dp[n - 1 ];
58
+ }
59
+ }
60
+ ```
You can’t perform that action at this time.
0 commit comments