Skip to content

Commit 6fe9df5

Browse files
committed
feat: add solutions to lc problem: No.2209
No.2209.Minimum White Tiles After Covering With Carpets
1 parent 2e243a2 commit 6fe9df5

File tree

6 files changed

+390
-2
lines changed

6 files changed

+390
-2
lines changed

solution/2200-2299/2209.Minimum White Tiles After Covering With Carpets/README.md

Lines changed: 143 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,22 +55,164 @@
5555

5656
<!-- 这里可写通用的实现逻辑 -->
5757

58+
**方法一:记忆化搜索**
59+
60+
设计函数 $dfs(i, j)$ 表示从下标 $i$ 开始,使用 $j$ 条地毯,最少有多少个白色砖块没有被覆盖。答案即为 $dfs(0, numCarpets)$。
61+
62+
对于下标 $i$,我们分情况讨论:
63+
64+
- 如果 $i \ge n$,说明已经覆盖完所有砖块,返回 $0$;
65+
- 如果 $floor[i] = 0$,则不需要使用地毯,直接跳过即可,即 $dfs(i, j) = dfs(i + 1, j)$;
66+
- 如果 $j = 0$,那么我们可以直接利用前缀和数组 $s$ 计算出剩余未被覆盖的白色砖块的数目,即 $dfs(i, j) = s[n] - s[i]$;
67+
- 如果 $floor[i] = 1$,那么我们可以选择使用地毯覆盖,也可以选择不使用地毯覆盖,取两者的最小值即可,即 $dfs(i, j) = min(dfs(i + 1, j), dfs(i + carpetLen, j - 1))$。
68+
69+
记忆化搜索即可。
70+
71+
时间复杂度 $O(n\times m)$,空间复杂度 $O(n\times m)$。其中 $n$ 和 $m$ 分别为字符串 $floor$ 的长度和 $numCarpets$ 的值。
72+
5873
<!-- tabs:start -->
5974

6075
### **Python3**
6176

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

6479
```python
65-
80+
class Solution:
81+
def minimumWhiteTiles(self, floor: str, numCarpets: int, carpetLen: int) -> int:
82+
@cache
83+
def dfs(i, j):
84+
if i >= n:
85+
return 0
86+
if floor[i] == '0':
87+
return dfs(i + 1, j)
88+
if j == 0:
89+
return s[-1] - s[i]
90+
return min(1 + dfs(i + 1, j), dfs(i + carpetLen, j - 1))
91+
92+
n = len(floor)
93+
s = [0] * (n + 1)
94+
for i, c in enumerate(floor):
95+
s[i + 1] = s[i] + int(c == '1')
96+
ans = dfs(0, numCarpets)
97+
dfs.cache_clear()
98+
return ans
6699
```
67100

68101
### **Java**
69102

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

72105
```java
106+
class Solution {
107+
private int[][] f;
108+
private int[] s;
109+
private int n;
110+
private int k;
111+
112+
public int minimumWhiteTiles(String floor, int numCarpets, int carpetLen) {
113+
n = floor.length();
114+
f = new int[n][numCarpets + 1];
115+
for (var e : f) {
116+
Arrays.fill(e, -1);
117+
}
118+
s = new int[n + 1];
119+
for (int i = 0; i < n; ++i) {
120+
s[i + 1] = s[i] + (floor.charAt(i) == '1' ? 1 : 0);
121+
}
122+
k = carpetLen;
123+
return dfs(0, numCarpets);
124+
}
125+
126+
private int dfs(int i, int j) {
127+
if (i >= n) {
128+
return 0;
129+
}
130+
if (j == 0) {
131+
return s[n] - s[i];
132+
}
133+
if (f[i][j] != -1) {
134+
return f[i][j];
135+
}
136+
if (s[i + 1] == s[i]) {
137+
return dfs(i + 1, j);
138+
}
139+
int ans = Math.min(1 + dfs(i + 1, j), dfs(i + k, j - 1));
140+
f[i][j] = ans;
141+
return ans;
142+
}
143+
}
144+
```
145+
146+
### **C++**
147+
148+
```cpp
149+
class Solution {
150+
public:
151+
int minimumWhiteTiles(string floor, int numCarpets, int carpetLen) {
152+
int n = floor.size();
153+
vector<vector<int>> f(n, vector<int>(numCarpets + 1, -1));
154+
vector<int> s(n + 1);
155+
for (int i = 0; i < n; ++i) {
156+
s[i + 1] = s[i] + (floor[i] == '1');
157+
}
158+
function<int(int, int)> dfs;
159+
dfs = [&](int i, int j) {
160+
if (i >= n) return 0;
161+
if (j == 0) return s[n] - s[i];
162+
if (f[i][j] != -1) return f[i][j];
163+
if (s[i + 1] == s[i]) return dfs(i + 1, j);
164+
int ans = min(1 + dfs(i + 1, j), dfs(i + carpetLen, j - 1));
165+
f[i][j] = ans;
166+
return ans;
167+
};
168+
return dfs(0, numCarpets);
169+
}
170+
};
171+
```
73172
173+
### **Go**
174+
175+
```go
176+
func minimumWhiteTiles(floor string, numCarpets int, carpetLen int) int {
177+
n := len(floor)
178+
f := make([][]int, n)
179+
for i := range f {
180+
f[i] = make([]int, numCarpets+1)
181+
for j := range f[i] {
182+
f[i][j] = -1
183+
}
184+
}
185+
s := make([]int, n+1)
186+
for i, c := range floor {
187+
s[i+1] = s[i] + int(c-'0')
188+
}
189+
var dfs func(i, j int) int
190+
dfs = func(i, j int) int {
191+
if i >= n {
192+
return 0
193+
}
194+
if j == 0 {
195+
return s[n] - s[i]
196+
}
197+
if f[i][j] != -1 {
198+
return f[i][j]
199+
}
200+
if s[i+1] == s[i] {
201+
return dfs(i+1, j)
202+
}
203+
ans := min(1+dfs(i+1, j), dfs(i+carpetLen, j-1))
204+
f[i][j] = ans
205+
return ans
206+
}
207+
return dfs(0, numCarpets)
208+
}
209+
210+
func min(a, b int) int {
211+
if a < b {
212+
return a
213+
}
214+
return b
215+
}
74216
```
75217

76218
### **TypeScript**

solution/2200-2299/2209.Minimum White Tiles After Covering With Carpets/README_EN.md

Lines changed: 128 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,140 @@ Note that the carpets are able to overlap one another.
5252
### **Python3**
5353

5454
```python
55-
55+
class Solution:
56+
def minimumWhiteTiles(self, floor: str, numCarpets: int, carpetLen: int) -> int:
57+
@cache
58+
def dfs(i, j):
59+
if i >= n:
60+
return 0
61+
if floor[i] == '0':
62+
return dfs(i + 1, j)
63+
if j == 0:
64+
return s[-1] - s[i]
65+
return min(1 + dfs(i + 1, j), dfs(i + carpetLen, j - 1))
66+
67+
n = len(floor)
68+
s = [0] * (n + 1)
69+
for i, c in enumerate(floor):
70+
s[i + 1] = s[i] + int(c == '1')
71+
ans = dfs(0, numCarpets)
72+
dfs.cache_clear()
73+
return ans
5674
```
5775

5876
### **Java**
5977

6078
```java
79+
class Solution {
80+
private int[][] f;
81+
private int[] s;
82+
private int n;
83+
private int k;
84+
85+
public int minimumWhiteTiles(String floor, int numCarpets, int carpetLen) {
86+
n = floor.length();
87+
f = new int[n][numCarpets + 1];
88+
for (var e : f) {
89+
Arrays.fill(e, -1);
90+
}
91+
s = new int[n + 1];
92+
for (int i = 0; i < n; ++i) {
93+
s[i + 1] = s[i] + (floor.charAt(i) == '1' ? 1 : 0);
94+
}
95+
k = carpetLen;
96+
return dfs(0, numCarpets);
97+
}
98+
99+
private int dfs(int i, int j) {
100+
if (i >= n) {
101+
return 0;
102+
}
103+
if (j == 0) {
104+
return s[n] - s[i];
105+
}
106+
if (f[i][j] != -1) {
107+
return f[i][j];
108+
}
109+
if (s[i + 1] == s[i]) {
110+
return dfs(i + 1, j);
111+
}
112+
int ans = Math.min(1 + dfs(i + 1, j), dfs(i + k, j - 1));
113+
f[i][j] = ans;
114+
return ans;
115+
}
116+
}
117+
```
118+
119+
### **C++**
120+
121+
```cpp
122+
class Solution {
123+
public:
124+
int minimumWhiteTiles(string floor, int numCarpets, int carpetLen) {
125+
int n = floor.size();
126+
vector<vector<int>> f(n, vector<int>(numCarpets + 1, -1));
127+
vector<int> s(n + 1);
128+
for (int i = 0; i < n; ++i) {
129+
s[i + 1] = s[i] + (floor[i] == '1');
130+
}
131+
function<int(int, int)> dfs;
132+
dfs = [&](int i, int j) {
133+
if (i >= n) return 0;
134+
if (j == 0) return s[n] - s[i];
135+
if (f[i][j] != -1) return f[i][j];
136+
if (s[i + 1] == s[i]) return dfs(i + 1, j);
137+
int ans = min(1 + dfs(i + 1, j), dfs(i + carpetLen, j - 1));
138+
f[i][j] = ans;
139+
return ans;
140+
};
141+
return dfs(0, numCarpets);
142+
}
143+
};
144+
```
61145
146+
### **Go**
147+
148+
```go
149+
func minimumWhiteTiles(floor string, numCarpets int, carpetLen int) int {
150+
n := len(floor)
151+
f := make([][]int, n)
152+
for i := range f {
153+
f[i] = make([]int, numCarpets+1)
154+
for j := range f[i] {
155+
f[i][j] = -1
156+
}
157+
}
158+
s := make([]int, n+1)
159+
for i, c := range floor {
160+
s[i+1] = s[i] + int(c-'0')
161+
}
162+
var dfs func(i, j int) int
163+
dfs = func(i, j int) int {
164+
if i >= n {
165+
return 0
166+
}
167+
if j == 0 {
168+
return s[n] - s[i]
169+
}
170+
if f[i][j] != -1 {
171+
return f[i][j]
172+
}
173+
if s[i+1] == s[i] {
174+
return dfs(i+1, j)
175+
}
176+
ans := min(1+dfs(i+1, j), dfs(i+carpetLen, j-1))
177+
f[i][j] = ans
178+
return ans
179+
}
180+
return dfs(0, numCarpets)
181+
}
182+
183+
func min(a, b int) int {
184+
if a < b {
185+
return a
186+
}
187+
return b
188+
}
62189
```
63190

64191
### **TypeScript**
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
class Solution {
2+
public:
3+
int minimumWhiteTiles(string floor, int numCarpets, int carpetLen) {
4+
int n = floor.size();
5+
vector<vector<int>> f(n, vector<int>(numCarpets + 1, -1));
6+
vector<int> s(n + 1);
7+
for (int i = 0; i < n; ++i) {
8+
s[i + 1] = s[i] + (floor[i] == '1');
9+
}
10+
function<int(int, int)> dfs;
11+
dfs = [&](int i, int j) {
12+
if (i >= n) return 0;
13+
if (j == 0) return s[n] - s[i];
14+
if (f[i][j] != -1) return f[i][j];
15+
if (s[i + 1] == s[i]) return dfs(i + 1, j);
16+
int ans = min(1 + dfs(i + 1, j), dfs(i + carpetLen, j - 1));
17+
f[i][j] = ans;
18+
return ans;
19+
};
20+
return dfs(0, numCarpets);
21+
}
22+
};
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
func minimumWhiteTiles(floor string, numCarpets int, carpetLen int) int {
2+
n := len(floor)
3+
f := make([][]int, n)
4+
for i := range f {
5+
f[i] = make([]int, numCarpets+1)
6+
for j := range f[i] {
7+
f[i][j] = -1
8+
}
9+
}
10+
s := make([]int, n+1)
11+
for i, c := range floor {
12+
s[i+1] = s[i] + int(c-'0')
13+
}
14+
var dfs func(i, j int) int
15+
dfs = func(i, j int) int {
16+
if i >= n {
17+
return 0
18+
}
19+
if j == 0 {
20+
return s[n] - s[i]
21+
}
22+
if f[i][j] != -1 {
23+
return f[i][j]
24+
}
25+
if s[i+1] == s[i] {
26+
return dfs(i+1, j)
27+
}
28+
ans := min(1+dfs(i+1, j), dfs(i+carpetLen, j-1))
29+
f[i][j] = ans
30+
return ans
31+
}
32+
return dfs(0, numCarpets)
33+
}
34+
35+
func min(a, b int) int {
36+
if a < b {
37+
return a
38+
}
39+
return b
40+
}

0 commit comments

Comments
 (0)