Skip to content

Commit fa459d4

Browse files
committed
feat: add solutions to lcof2 problem: No.090
No.090.House Robber II
1 parent b2e165e commit fa459d4

File tree

5 files changed

+189
-1
lines changed

5 files changed

+189
-1
lines changed

lcof2/剑指 Offer II 090. 环形房屋偷盗/README.md

+100-1
Original file line numberDiff line numberDiff line change
@@ -50,22 +50,121 @@
5050

5151
<!-- 这里可写通用的实现逻辑 -->
5252

53+
直接利用上一题的代码,同样的思路,只不过需要特殊考虑第一个房子(环的连接处)
54+
5355
<!-- tabs:start -->
5456

5557
### **Python3**
5658

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

5961
```python
60-
62+
class Solution:
63+
def rob(self, nums: List[int]) -> int:
64+
if len(nums) == 1:
65+
return nums[0]
66+
return max(self._rob(nums[:-1]), self._rob(nums[1:]))
67+
68+
def _rob(self, nums: List[int]) -> int:
69+
if len(nums) == 1:
70+
return nums[0]
71+
72+
n = len(nums)
73+
dp = [0] * n
74+
dp[0], dp[1] = nums[0], max(nums[0], nums[1])
75+
for i in range(2, n):
76+
dp[i] = max(dp[i - 2] + nums[i], dp[i - 1])
77+
return dp[n - 1]
6178
```
6279

6380
### **Java**
6481

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

6784
```java
85+
class Solution {
86+
public int rob(int[] nums) {
87+
if (nums.length == 1) {
88+
return nums[0];
89+
}
90+
return Math.max(_rob(nums, 0, nums.length - 1), _rob(nums, 1, nums.length));
91+
}
92+
93+
public int _rob(int[] nums, int start, int end) {
94+
if (start + 1 == end) {
95+
return nums[start];
96+
}
97+
int n = end - start;
98+
int[] dp = new int[n];
99+
dp[0] = nums[start];
100+
dp[1] = Math.max(nums[start], nums[start + 1]);
101+
for (int i = 2; i < n; i++) {
102+
dp[i] = Math.max(dp[i - 2] + nums[start + i], dp[i - 1]);
103+
}
104+
return dp[n - 1];
105+
}
106+
}
107+
```
108+
109+
### **C++**
110+
111+
```cpp
112+
class Solution {
113+
public:
114+
int rob(vector<int>& nums) {
115+
if (nums.size() == 1) {
116+
return nums[0];
117+
}
118+
return max(_rob(nums, 0, nums.size() - 1), _rob(nums, 1, nums.size()));
119+
}
120+
121+
int _rob(vector<int>& nums, int start, int end) {
122+
if (start + 1 == end) {
123+
return nums[start];
124+
}
125+
int n = end - start;
126+
vector<int> dp(n, 0);
127+
dp[0] = nums[start];
128+
dp[1] = max(nums[start], nums[start + 1]);
129+
for (int i = 2; i < n; ++i) {
130+
dp[i] = max(dp[i - 2] + nums[start + i], dp[i - 1]);
131+
}
132+
return dp[n - 1];
133+
}
134+
};
135+
```
68136
137+
### **Go**
138+
139+
```go
140+
func rob(nums []int) int {
141+
if len(nums) == 1 {
142+
return nums[0]
143+
}
144+
return max(_rob(nums[:len(nums)-1]), _rob(nums[1:]))
145+
}
146+
147+
func _rob(nums []int) int {
148+
if len(nums) == 1 {
149+
return nums[0]
150+
}
151+
152+
n := len(nums)
153+
dp := make([]int, n)
154+
dp[0] = nums[0]
155+
dp[1] = max(nums[0], nums[1])
156+
for i := 2; i < n; i++ {
157+
dp[i] = max(dp[i-2]+nums[i], dp[i-1])
158+
}
159+
return dp[n-1]
160+
}
161+
162+
func max(x, y int) int {
163+
if x > y {
164+
return x
165+
}
166+
return y
167+
}
69168
```
70169

71170
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
class Solution {
2+
public:
3+
int rob(vector<int>& nums) {
4+
if (nums.size() == 1) {
5+
return nums[0];
6+
}
7+
return max(_rob(nums, 0, nums.size() - 1), _rob(nums, 1, nums.size()));
8+
}
9+
10+
int _rob(vector<int>& nums, int start, int end) {
11+
if (start + 1 == end) {
12+
return nums[start];
13+
}
14+
int n = end - start;
15+
vector<int> dp(n, 0);
16+
dp[0] = nums[start];
17+
dp[1] = max(nums[start], nums[start + 1]);
18+
for (int i = 2; i < n; ++i) {
19+
dp[i] = max(dp[i - 2] + nums[start + i], dp[i - 1]);
20+
}
21+
return dp[n - 1];
22+
}
23+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
func rob(nums []int) int {
2+
if len(nums) == 1 {
3+
return nums[0]
4+
}
5+
return max(_rob(nums[:len(nums)-1]), _rob(nums[1:]))
6+
}
7+
8+
func _rob(nums []int) int {
9+
if len(nums) == 1 {
10+
return nums[0]
11+
}
12+
13+
n := len(nums)
14+
dp := make([]int, n)
15+
dp[0] = nums[0]
16+
dp[1] = max(nums[0], nums[1])
17+
for i := 2; i < n; i++ {
18+
dp[i] = max(dp[i-2]+nums[i], dp[i-1])
19+
}
20+
return dp[n-1]
21+
}
22+
23+
func max(x, y int) int {
24+
if x > y {
25+
return x
26+
}
27+
return y
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
class Solution {
2+
public int rob(int[] nums) {
3+
if (nums.length == 1) {
4+
return nums[0];
5+
}
6+
return Math.max(_rob(nums, 0, nums.length - 1), _rob(nums, 1, nums.length));
7+
}
8+
9+
public int _rob(int[] nums, int start, int end) {
10+
if (start + 1 == end) {
11+
return nums[start];
12+
}
13+
int n = end - start;
14+
int[] dp = new int[n];
15+
dp[0] = nums[start];
16+
dp[1] = Math.max(nums[start], nums[start + 1]);
17+
for (int i = 2; i < n; i++) {
18+
dp[i] = Math.max(dp[i - 2] + nums[start + i], dp[i - 1]);
19+
}
20+
return dp[n - 1];
21+
}
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
class Solution:
2+
def rob(self, nums: List[int]) -> int:
3+
if len(nums) == 1:
4+
return nums[0]
5+
return max(self._rob(nums[:-1]), self._rob(nums[1:]))
6+
7+
def _rob(self, nums: List[int]) -> int:
8+
if len(nums) == 1:
9+
return nums[0]
10+
11+
n = len(nums)
12+
dp = [0] * n
13+
dp[0], dp[1] = nums[0], max(nums[0], nums[1])
14+
for i in range(2, n):
15+
dp[i] = max(dp[i - 2] + nums[i], dp[i - 1])
16+
return dp[n - 1]

0 commit comments

Comments
 (0)