Skip to content

Commit fea1440

Browse files
committed
feat: add solutions to lc problem: No.2320
No.2320.Count Number of Ways to Place Houses
1 parent c6f9afb commit fea1440

File tree

8 files changed

+181
-105
lines changed

8 files changed

+181
-105
lines changed

solution/2300-2399/2320.Count Number of Ways to Place Houses/README.md

+72-35
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,21 @@
4545

4646
<!-- 这里可写通用的实现逻辑 -->
4747

48+
**方法一:动态规划**
49+
50+
由于街道两侧房子的摆放互不影响,因此,我们可以只考虑一侧的摆放情况,最后将一侧的方案数平方取模得到最终结果。
51+
52+
我们定义 $f[i]$ 表示放置前 $i+1$ 个地块,且最后一个地块放置房子的方案数,定义 $g[i]$ 表示放置前 $i+1$ 个地块,且最后一个地块不放置房子的方案数。初始时 $f[0] = g[0] = 1$。
53+
54+
当我们放置第 $i+1$ 个地块时,有两种情况:
55+
56+
- 如果第 $i+1$ 个地块放置房子,那么第 $i$ 个地块必须不放置房子,因此方案数 $f[i]=g[i-1]$;
57+
- 如果第 $i+1$ 个地块不放置房子,那么第 $i$ 个地块可以放置房子,也可以不放置房子,因此方案数 $g[i]=f[i-1]+g[i-1]$。
58+
59+
最终,我们将 $f[n-1]+g[n-1]$ 的平方取模即为答案。
60+
61+
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为街道的长度。
62+
4863
<!-- tabs:start -->
4964

5065
### **Python3**
@@ -55,13 +70,13 @@
5570
class Solution:
5671
def countHousePlacements(self, n: int) -> int:
5772
mod = 10**9 + 7
58-
f = [[0] * 2 for _ in range(n)]
59-
f[0] = [1, 1]
73+
f = [1] * n
74+
g = [1] * n
6075
for i in range(1, n):
61-
f[i][0] = f[i - 1][0] + f[i - 1][1]
62-
f[i][1] = f[i - 1][0]
63-
s = sum(f[-1])
64-
return (s * s) % mod
76+
f[i] = g[i - 1]
77+
g[i] = (f[i - 1] + g[i - 1]) % mod
78+
v = f[-1] + g[-1]
79+
return v * v % mod
6580
```
6681

6782
### **Java**
@@ -71,15 +86,17 @@ class Solution:
7186
```java
7287
class Solution {
7388
public int countHousePlacements(int n) {
74-
int mod = (int) 1e9 + 7;
75-
long[][] f = new long[n][2];
76-
f[0] = new long[] {1, 1};
89+
final int mod = (int) 1e9 + 7;
90+
int[] f = new int[n];
91+
int[] g = new int[n];
92+
f[0] = 1;
93+
g[0] = 1;
7794
for (int i = 1; i < n; ++i) {
78-
f[i][0] = (f[i - 1][0] + f[i - 1][1]) % mod;
79-
f[i][1] = f[i - 1][0];
95+
f[i] = g[i - 1];
96+
g[i] = (f[i - 1] + g[i - 1]) % mod;
8097
}
81-
long s = f[n - 1][0] + f[n - 1][1];
82-
return (int) ((s * s) % mod);
98+
long v = (f[n - 1] + g[n - 1]) % mod;
99+
return (int) (v * v % mod);
83100
}
84101
}
85102
```
@@ -90,15 +107,15 @@ class Solution {
90107
class Solution {
91108
public:
92109
int countHousePlacements(int n) {
93-
int mod = 1e9 + 7;
94-
vector<vector<long>> f(n, vector<long>(2));
95-
f[0] = {1, 1};
110+
const int mod = 1e9 + 7;
111+
int f[n], g[n];
112+
f[0] = g[0] = 1;
96113
for (int i = 1; i < n; ++i) {
97-
f[i][0] = (f[i - 1][0] + f[i - 1][1]) % mod;
98-
f[i][1] = f[i - 1][0];
114+
f[i] = g[i - 1];
115+
g[i] = (f[i - 1] + g[i - 1]) % mod;
99116
}
100-
long s = f[n - 1][0] + f[n - 1][1];
101-
return (int)((s * s) % mod);
117+
long v = f[n - 1] + g[n - 1];
118+
return v * v % mod;
102119
}
103120
};
104121
```
@@ -107,32 +124,52 @@ public:
107124
108125
```go
109126
func countHousePlacements(n int) int {
110-
mod := int(1e9) + 7
111-
f := make([][]int, n)
112-
for i := range f {
113-
f[i] = make([]int, 2)
114-
}
115-
f[0] = []int{1, 1}
127+
const mod = 1e9 + 7
128+
f := make([]int, n)
129+
g := make([]int, n)
130+
f[0], g[0] = 1, 1
116131
for i := 1; i < n; i++ {
117-
f[i][0] = (f[i-1][0] + f[i-1][1]) % mod
118-
f[i][1] = f[i-1][0]
132+
f[i] = g[i-1]
133+
g[i] = (f[i-1] + g[i-1]) % mod
119134
}
120-
s := f[n-1][0] + f[n-1][1]
121-
return (s * s) % mod
135+
v := f[n-1] + g[n-1]
136+
return v * v % mod
122137
}
123138
```
124139

125140
### **TypeScript**
126141

127142
```ts
128143
function countHousePlacements(n: number): number {
144+
const f = new Array(n);
145+
const g = new Array(n);
146+
f[0] = g[0] = 1n;
129147
const mod = BigInt(10 ** 9 + 7);
130-
let pre = 1n,
131-
count = 2n;
132-
for (let i = 2; i <= n; i++) {
133-
[count, pre] = [(count + pre) % mod, count];
148+
for (let i = 1; i < n; ++i) {
149+
f[i] = g[i - 1];
150+
g[i] = (f[i - 1] + g[i - 1]) % mod;
151+
}
152+
const v = f[n - 1] + g[n - 1];
153+
return Number(v ** 2n % mod);
154+
}
155+
```
156+
157+
### **C#**
158+
159+
```cs
160+
public class Solution {
161+
public int CountHousePlacements(int n) {
162+
const int mod = (int) 1e9 + 7;
163+
int[] f = new int[n];
164+
int[] g = new int[n];
165+
f[0] = g[0] = 1;
166+
for (int i = 1; i < n; ++i) {
167+
f[i] = g[i - 1];
168+
g[i] = (f[i - 1] + g[i - 1]) % mod;
169+
}
170+
long v = (f[n - 1] + g[n - 1]) % mod;
171+
return (int) (v * v % mod);
134172
}
135-
return Number(count ** 2n % mod);
136173
}
137174
```
138175

solution/2300-2399/2320.Count Number of Ways to Place Houses/README_EN.md

+57-35
Original file line numberDiff line numberDiff line change
@@ -49,29 +49,31 @@ Possible arrangements:
4949
class Solution:
5050
def countHousePlacements(self, n: int) -> int:
5151
mod = 10**9 + 7
52-
f = [[0] * 2 for _ in range(n)]
53-
f[0] = [1, 1]
52+
f = [1] * n
53+
g = [1] * n
5454
for i in range(1, n):
55-
f[i][0] = f[i - 1][0] + f[i - 1][1]
56-
f[i][1] = f[i - 1][0]
57-
s = sum(f[-1])
58-
return (s * s) % mod
55+
f[i] = g[i - 1]
56+
g[i] = (f[i - 1] + g[i - 1]) % mod
57+
v = f[-1] + g[-1]
58+
return v * v % mod
5959
```
6060

6161
### **Java**
6262

6363
```java
6464
class Solution {
6565
public int countHousePlacements(int n) {
66-
int mod = (int) 1e9 + 7;
67-
long[][] f = new long[n][2];
68-
f[0] = new long[] {1, 1};
66+
final int mod = (int) 1e9 + 7;
67+
int[] f = new int[n];
68+
int[] g = new int[n];
69+
f[0] = 1;
70+
g[0] = 1;
6971
for (int i = 1; i < n; ++i) {
70-
f[i][0] = (f[i - 1][0] + f[i - 1][1]) % mod;
71-
f[i][1] = f[i - 1][0];
72+
f[i] = g[i - 1];
73+
g[i] = (f[i - 1] + g[i - 1]) % mod;
7274
}
73-
long s = f[n - 1][0] + f[n - 1][1];
74-
return (int) ((s * s) % mod);
75+
long v = (f[n - 1] + g[n - 1]) % mod;
76+
return (int) (v * v % mod);
7577
}
7678
}
7779
```
@@ -82,15 +84,15 @@ class Solution {
8284
class Solution {
8385
public:
8486
int countHousePlacements(int n) {
85-
int mod = 1e9 + 7;
86-
vector<vector<long>> f(n, vector<long>(2));
87-
f[0] = {1, 1};
87+
const int mod = 1e9 + 7;
88+
int f[n], g[n];
89+
f[0] = g[0] = 1;
8890
for (int i = 1; i < n; ++i) {
89-
f[i][0] = (f[i - 1][0] + f[i - 1][1]) % mod;
90-
f[i][1] = f[i - 1][0];
91+
f[i] = g[i - 1];
92+
g[i] = (f[i - 1] + g[i - 1]) % mod;
9193
}
92-
long s = f[n - 1][0] + f[n - 1][1];
93-
return (int)((s * s) % mod);
94+
long v = f[n - 1] + g[n - 1];
95+
return v * v % mod;
9496
}
9597
};
9698
```
@@ -99,32 +101,52 @@ public:
99101
100102
```go
101103
func countHousePlacements(n int) int {
102-
mod := int(1e9) + 7
103-
f := make([][]int, n)
104-
for i := range f {
105-
f[i] = make([]int, 2)
106-
}
107-
f[0] = []int{1, 1}
104+
const mod = 1e9 + 7
105+
f := make([]int, n)
106+
g := make([]int, n)
107+
f[0], g[0] = 1, 1
108108
for i := 1; i < n; i++ {
109-
f[i][0] = (f[i-1][0] + f[i-1][1]) % mod
110-
f[i][1] = f[i-1][0]
109+
f[i] = g[i-1]
110+
g[i] = (f[i-1] + g[i-1]) % mod
111111
}
112-
s := f[n-1][0] + f[n-1][1]
113-
return (s * s) % mod
112+
v := f[n-1] + g[n-1]
113+
return v * v % mod
114114
}
115115
```
116116

117117
### **TypeScript**
118118

119119
```ts
120120
function countHousePlacements(n: number): number {
121+
const f = new Array(n);
122+
const g = new Array(n);
123+
f[0] = g[0] = 1n;
121124
const mod = BigInt(10 ** 9 + 7);
122-
let pre = 1n,
123-
count = 2n;
124-
for (let i = 2; i <= n; i++) {
125-
[count, pre] = [(count + pre) % mod, count];
125+
for (let i = 1; i < n; ++i) {
126+
f[i] = g[i - 1];
127+
g[i] = (f[i - 1] + g[i - 1]) % mod;
128+
}
129+
const v = f[n - 1] + g[n - 1];
130+
return Number(v ** 2n % mod);
131+
}
132+
```
133+
134+
### **C#**
135+
136+
```cs
137+
public class Solution {
138+
public int CountHousePlacements(int n) {
139+
const int mod = (int) 1e9 + 7;
140+
int[] f = new int[n];
141+
int[] g = new int[n];
142+
f[0] = g[0] = 1;
143+
for (int i = 1; i < n; ++i) {
144+
f[i] = g[i - 1];
145+
g[i] = (f[i - 1] + g[i - 1]) % mod;
146+
}
147+
long v = (f[n - 1] + g[n - 1]) % mod;
148+
return (int) (v * v % mod);
126149
}
127-
return Number(count ** 2n % mod);
128150
}
129151
```
130152

Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
class Solution {
22
public:
33
int countHousePlacements(int n) {
4-
int mod = 1e9 + 7;
5-
vector<vector<long>> f(n, vector<long>(2));
6-
f[0] = {1, 1};
4+
const int mod = 1e9 + 7;
5+
int f[n], g[n];
6+
f[0] = g[0] = 1;
77
for (int i = 1; i < n; ++i) {
8-
f[i][0] = (f[i - 1][0] + f[i - 1][1]) % mod;
9-
f[i][1] = f[i - 1][0];
8+
f[i] = g[i - 1];
9+
g[i] = (f[i - 1] + g[i - 1]) % mod;
1010
}
11-
long s = f[n - 1][0] + f[n - 1][1];
12-
return (int) ((s * s) % mod);
11+
long v = f[n - 1] + g[n - 1];
12+
return v * v % mod;
1313
}
1414
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
public class Solution {
2+
public int CountHousePlacements(int n) {
3+
const int mod = (int) 1e9 + 7;
4+
int[] f = new int[n];
5+
int[] g = new int[n];
6+
f[0] = g[0] = 1;
7+
for (int i = 1; i < n; ++i) {
8+
f[i] = g[i - 1];
9+
g[i] = (f[i - 1] + g[i - 1]) % mod;
10+
}
11+
long v = (f[n - 1] + g[n - 1]) % mod;
12+
return (int) (v * v % mod);
13+
}
14+
}
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
func countHousePlacements(n int) int {
2-
mod := int(1e9) + 7
3-
f := make([][]int, n)
4-
for i := range f {
5-
f[i] = make([]int, 2)
6-
}
7-
f[0] = []int{1, 1}
2+
const mod = 1e9 + 7
3+
f := make([]int, n)
4+
g := make([]int, n)
5+
f[0], g[0] = 1, 1
86
for i := 1; i < n; i++ {
9-
f[i][0] = (f[i-1][0] + f[i-1][1]) % mod
10-
f[i][1] = f[i-1][0]
7+
f[i] = g[i-1]
8+
g[i] = (f[i-1] + g[i-1]) % mod
119
}
12-
s := f[n-1][0] + f[n-1][1]
13-
return (s * s) % mod
10+
v := f[n-1] + g[n-1]
11+
return v * v % mod
1412
}
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
class Solution {
22
public int countHousePlacements(int n) {
3-
int mod = (int) 1e9 + 7;
4-
long[][] f = new long[n][2];
5-
f[0] = new long[] {1, 1};
3+
final int mod = (int) 1e9 + 7;
4+
int[] f = new int[n];
5+
int[] g = new int[n];
6+
f[0] = 1;
7+
g[0] = 1;
68
for (int i = 1; i < n; ++i) {
7-
f[i][0] = (f[i - 1][0] + f[i - 1][1]) % mod;
8-
f[i][1] = f[i - 1][0];
9+
f[i] = g[i - 1];
10+
g[i] = (f[i - 1] + g[i - 1]) % mod;
911
}
10-
long s = f[n - 1][0] + f[n - 1][1];
11-
return (int) ((s * s) % mod);
12+
long v = (f[n - 1] + g[n - 1]) % mod;
13+
return (int) (v * v % mod);
1214
}
1315
}
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
class Solution:
22
def countHousePlacements(self, n: int) -> int:
33
mod = 10**9 + 7
4-
f = [[0] * 2 for _ in range(n)]
5-
f[0] = [1, 1]
4+
f = [1] * n
5+
g = [1] * n
66
for i in range(1, n):
7-
f[i][0] = f[i - 1][0] + f[i - 1][1]
8-
f[i][1] = f[i - 1][0]
9-
s = sum(f[-1])
10-
return (s * s) % mod
7+
f[i] = g[i - 1]
8+
g[i] = (f[i - 1] + g[i - 1]) % mod
9+
v = f[-1] + g[-1]
10+
return v * v % mod

0 commit comments

Comments
 (0)