Skip to content

Commit 90defe1

Browse files
committed
feat: add python and java solutions to leetcode problem: No.0213
1 parent ac3d1b7 commit 90defe1

File tree

10 files changed

+183
-74
lines changed

10 files changed

+183
-74
lines changed

README.md

+3
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,9 @@
8383

8484
### 动态规划
8585

86+
1. [打家劫舍](/solution/0100-0199/0198.House%20Robber/README.md)
87+
1. [打家劫舍 II](/solution/0200-0299/0213.House%20Robber%20II/README.md)
88+
8689
### 混合问题
8790

8891
## 维护者

README_EN.md

+3
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,9 @@ Complete solutions to [LeetCode](https://leetcode-cn.com/problemset/all/), [LCOF
7878

7979
### Dynamic Programming
8080

81+
1. [House Robber](/solution/0100-0199/0198.House%20Robber/README_EN.md)
82+
1. [House Robber II](/solution/0200-0299/0213.House%20Robber%20II/README_EN.md)
83+
8184
### Misc
8285

8386
## Maintainer

solution/0100-0199/0198.House Robber/README.md

+10-10
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,11 @@ class Solution:
4242
n = len(nums)
4343
if n == 1:
4444
return nums[0]
45-
dp = [0 for _ in range(n)]
46-
dp[0] = nums[0]
47-
dp[1] = max(nums[0], nums[1])
45+
pre, cur = nums[0], max(nums[0], nums[1])
4846
for i in range(2, n):
49-
dp[i] = max(dp[i - 1], dp[i - 2] + nums[i])
50-
return dp[n - 1]
47+
t = max(pre + nums[i], cur)
48+
pre, cur = cur, t
49+
return cur
5150
```
5251

5352
### **Java**
@@ -64,13 +63,14 @@ class Solution {
6463
if (n == 1) {
6564
return nums[0];
6665
}
67-
int[] dp = new int[n];
68-
dp[0] = nums[0];
69-
dp[1] = Math.max(nums[0], nums[1]);
66+
int pre = nums[0];
67+
int cur = Math.max(nums[0], nums[1]);
7068
for (int i = 2; i < n; ++i) {
71-
dp[i] = Math.max(dp[i - 1], dp[i - 2] + nums[i]);
69+
int t = Math.max(pre + nums[i], cur);
70+
pre = cur;
71+
cur = t;
7272
}
73-
return dp[n - 1];
73+
return cur;
7474
}
7575
}
7676
```

solution/0100-0199/0198.House Robber/README_EN.md

+10-10
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,11 @@ class Solution:
4848
n = len(nums)
4949
if n == 1:
5050
return nums[0]
51-
dp = [0 for _ in range(n)]
52-
dp[0] = nums[0]
53-
dp[1] = max(nums[0], nums[1])
51+
pre, cur = nums[0], max(nums[0], nums[1])
5452
for i in range(2, n):
55-
dp[i] = max(dp[i - 1], dp[i - 2] + nums[i])
56-
return dp[n - 1]
53+
t = max(pre + nums[i], cur)
54+
pre, cur = cur, t
55+
return cur
5756
```
5857

5958
### **Java**
@@ -68,13 +67,14 @@ class Solution {
6867
if (n == 1) {
6968
return nums[0];
7069
}
71-
int[] dp = new int[n];
72-
dp[0] = nums[0];
73-
dp[1] = Math.max(nums[0], nums[1]);
70+
int pre = nums[0];
71+
int cur = Math.max(nums[0], nums[1]);
7472
for (int i = 2; i < n; ++i) {
75-
dp[i] = Math.max(dp[i - 1], dp[i - 2] + nums[i]);
73+
int t = Math.max(pre + nums[i], cur);
74+
pre = cur;
75+
cur = t;
7676
}
77-
return dp[n - 1];
77+
return cur;
7878
}
7979
}
8080
```

solution/0100-0199/0198.House Robber/Solution.java

+6-5
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,13 @@ public int rob(int[] nums) {
77
if (n == 1) {
88
return nums[0];
99
}
10-
int[] dp = new int[n];
11-
dp[0] = nums[0];
12-
dp[1] = Math.max(nums[0], nums[1]);
10+
int pre = nums[0];
11+
int cur = Math.max(nums[0], nums[1]);
1312
for (int i = 2; i < n; ++i) {
14-
dp[i] = Math.max(dp[i - 1], dp[i - 2] + nums[i]);
13+
int t = Math.max(pre + nums[i], cur);
14+
pre = cur;
15+
cur = t;
1516
}
16-
return dp[n - 1];
17+
return cur;
1718
}
1819
}

solution/0100-0199/0198.House Robber/Solution.py

+4-5
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,8 @@ def rob(self, nums: List[int]) -> int:
55
n = len(nums)
66
if n == 1:
77
return nums[0]
8-
dp = [0 for _ in range(n)]
9-
dp[0] = nums[0]
10-
dp[1] = max(nums[0], nums[1])
8+
pre, cur = nums[0], max(nums[0], nums[1])
119
for i in range(2, n):
12-
dp[i] = max(dp[i - 1], dp[i - 2] + nums[i])
13-
return dp[n - 1]
10+
t = max(pre + nums[i], cur)
11+
pre, cur = cur, t
12+
return cur

solution/0200-0299/0213.House Robber II/README.md

+54-2
Original file line numberDiff line numberDiff line change
@@ -27,22 +27,74 @@
2727

2828
<!-- 这里可写通用的实现逻辑 -->
2929

30+
环状排列意味着第一个房屋和最后一个房屋中最多只能选择一个偷窃,因此可以把此环状排列房间问题约化为两个单排排列房屋子问题。
31+
32+
- 不偷第一个房屋(那么最后一个房屋能偷),即求:`_rob(nums[1:])`
33+
- 偷第一个房屋(那么最后一个房屋不能偷),即求:`_rob(nums[:-1])`
34+
35+
`res = max(_rob(nums[1:]), _rob(nums[:-1]))`
36+
3037
<!-- tabs:start -->
3138

3239
### **Python3**
3340

3441
<!-- 这里可写当前语言的特殊实现逻辑 -->
3542

3643
```python
37-
44+
class Solution:
45+
def rob(self, nums: List[int]) -> int:
46+
def _rob(nums):
47+
n = len(nums)
48+
if n == 0:
49+
return 0
50+
if n == 1:
51+
return nums[0]
52+
pre, cur = nums[0], max(nums[0], nums[1])
53+
for i in range(2, n):
54+
t = max(pre + nums[i], cur)
55+
pre, cur = cur, t
56+
return cur
57+
58+
n = len(nums)
59+
if n == 1:
60+
return nums[0]
61+
return max(_rob(nums[1:]), _rob(nums[:-1]))
3862
```
3963

4064
### **Java**
4165

4266
<!-- 这里可写当前语言的特殊实现逻辑 -->
4367

4468
```java
45-
69+
class Solution {
70+
public int rob(int[] nums) {
71+
int n = nums.length;
72+
if (n == 1) {
73+
return nums[0];
74+
}
75+
int sub1 = robInternal(Arrays.copyOfRange(nums, 0, n - 1));
76+
int sub2 = robInternal(Arrays.copyOfRange(nums, 1, n));
77+
return Math.max(sub1, sub2);
78+
}
79+
80+
private int robInternal(int[] nums) {
81+
int n;
82+
if ((n = nums.length) == 0) {
83+
return 0;
84+
}
85+
if (n == 1) {
86+
return nums[0];
87+
}
88+
int pre = nums[0];
89+
int cur = Math.max(nums[0], nums[1]);
90+
for (int i = 2; i < n; ++i) {
91+
int t = Math.max(pre + nums[i], cur);
92+
pre = cur;
93+
cur = t;
94+
}
95+
return cur;
96+
}
97+
}
4698
```
4799

48100
### **...**

solution/0200-0299/0213.House Robber II/README_EN.md

+47-2
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,58 @@
4141
### **Python3**
4242

4343
```python
44-
44+
class Solution:
45+
def rob(self, nums: List[int]) -> int:
46+
def _rob(nums):
47+
n = len(nums)
48+
if n == 0:
49+
return 0
50+
if n == 1:
51+
return nums[0]
52+
pre, cur = nums[0], max(nums[0], nums[1])
53+
for i in range(2, n):
54+
t = max(pre + nums[i], cur)
55+
pre, cur = cur, t
56+
return cur
57+
58+
n = len(nums)
59+
if n == 1:
60+
return nums[0]
61+
return max(_rob(nums[1:]), _rob(nums[:-1]))
4562
```
4663

4764
### **Java**
4865

4966
```java
50-
67+
class Solution {
68+
public int rob(int[] nums) {
69+
int n = nums.length;
70+
if (n == 1) {
71+
return nums[0];
72+
}
73+
int sub1 = robInternal(Arrays.copyOfRange(nums, 0, n - 1));
74+
int sub2 = robInternal(Arrays.copyOfRange(nums, 1, n));
75+
return Math.max(sub1, sub2);
76+
}
77+
78+
private int robInternal(int[] nums) {
79+
int n;
80+
if ((n = nums.length) == 0) {
81+
return 0;
82+
}
83+
if (n == 1) {
84+
return nums[0];
85+
}
86+
int pre = nums[0];
87+
int cur = Math.max(nums[0], nums[1]);
88+
for (int i = 2; i < n; ++i) {
89+
int t = Math.max(pre + nums[i], cur);
90+
pre = cur;
91+
cur = t;
92+
}
93+
return cur;
94+
}
95+
}
5196
```
5297

5398
### **...**
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,29 @@
1-
public class Solution {
2-
public static int rob(int[] nums) {
3-
4-
if (nums == null || nums.length == 0) {
5-
return 0;
6-
}
7-
8-
if (nums.length == 1) {
9-
return nums[0];
10-
}
11-
12-
if (nums.length == 2) {
13-
return Math.max(nums[0], nums[1]);
14-
}
15-
16-
return Math.max(help(Arrays.copyOfRange(nums, 0, nums.length - 1)),
17-
help(Arrays.copyOfRange(nums, 1, nums.length)));
18-
}
19-
20-
public static int help(int[] nums) {
21-
22-
if (nums.length == 0) {
23-
return 0;
24-
}
25-
26-
if (nums.length == 1) {
27-
return nums[0];
28-
}
29-
30-
int[] P = new int[nums.length];
31-
32-
P[0] = nums[0];
33-
P[1] = Math.max(nums[0], nums[1]);
34-
35-
for (int i = 2; i < nums.length; i++) {
36-
P[i] = Math.max(nums[i] + P[i - 2], P[i - 1]);
37-
}
38-
39-
return P[nums.length - 1];
40-
}
1+
class Solution {
2+
public int rob(int[] nums) {
3+
int n = nums.length;
4+
if (n == 1) {
5+
return nums[0];
6+
}
7+
int sub1 = robInternal(Arrays.copyOfRange(nums, 0, n - 1));
8+
int sub2 = robInternal(Arrays.copyOfRange(nums, 1, n));
9+
return Math.max(sub1, sub2);
10+
}
11+
12+
private int robInternal(int[] nums) {
13+
int n;
14+
if ((n = nums.length) == 0) {
15+
return 0;
16+
}
17+
if (n == 1) {
18+
return nums[0];
19+
}
20+
int pre = nums[0];
21+
int cur = Math.max(nums[0], nums[1]);
22+
for (int i = 2; i < n; ++i) {
23+
int t = Math.max(pre + nums[i], cur);
24+
pre = cur;
25+
cur = t;
26+
}
27+
return cur;
28+
}
4129
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
class Solution:
2+
def rob(self, nums: List[int]) -> int:
3+
def _rob(nums):
4+
n = len(nums)
5+
if n == 0:
6+
return 0
7+
if n == 1:
8+
return nums[0]
9+
pre, cur = nums[0], max(nums[0], nums[1])
10+
for i in range(2, n):
11+
t = max(pre + nums[i], cur)
12+
pre, cur = cur, t
13+
return cur
14+
15+
n = len(nums)
16+
if n == 1:
17+
return nums[0]
18+
return max(_rob(nums[1:]), _rob(nums[:-1]))

0 commit comments

Comments
 (0)