Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 94bdecf

Browse files
committed
添加474. 一和零 java 三维DP数组实现代码
1 parent e348823 commit 94bdecf

File tree

1 file changed

+64
-1
lines changed

1 file changed

+64
-1
lines changed

‎problems/0474.一和零.md‎

Lines changed: 64 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -261,8 +261,70 @@ public:
261261

262262
## 其他语言版本
263263

264-
265264
### Java
265+
266+
三维DP数组实现
267+
268+
```java
269+
class Solution {
270+
public int findMaxForm(String[] strs, int m, int n) {
271+
/// 数组有三个维度
272+
// 第一个维度:取前面的几个字符串
273+
// 第二个维度:0的数量限制(背包维度 1 容量)
274+
// 第三个维度:1的数量限制(背包维度 2 容量)
275+
int[][][] dpArr = new int[strs.length][m + 1][n + 1];
276+
277+
/// 初始化dpArr数组
278+
// 计算第一个字符串的零数量和1数量
279+
int zeroNum = 0;
280+
int oneNum = 0;
281+
for (char c : strs[0].toCharArray()) {
282+
if (c == '0') {
283+
zeroNum++;
284+
} else {
285+
oneNum++;
286+
}
287+
}
288+
// 当0数量、1数量都容得下第一个字符串时,将DP数组的相应位置初始化为1,因为当前的子集数量为1
289+
for (int j = zeroNum; j <= m; j++) {
290+
for (int k = oneNum; k <= n; k++) {
291+
dpArr[0][j][k] = 1;
292+
}
293+
}
294+
/// 依次填充加入第i个字符串之后的DP数组
295+
for (int i = 1; i < strs.length; i++) {
296+
zeroNum = 0;
297+
oneNum = 0;
298+
for (char c : strs[i].toCharArray()) {
299+
if (c == '0') {
300+
zeroNum++;
301+
} else {
302+
oneNum++;
303+
}
304+
}
305+
for (int j = 0; j <= m; j++) {
306+
for (int k = 0; k <= n; k++) {
307+
if (j >= zeroNum && k >= oneNum) {
308+
// --if-- 当0数量维度和1数量维度的容量都大于等于当前字符串的0数量和1数量时,才考虑是否将当前字符串放入背包
309+
// 不放入第i个字符串,子集数量仍为 dpArr[i - 1][j][k]
310+
// 放入第i个字符串,需要在0维度腾出 zeroNum 个容量,1维度腾出 oneNum 个容量,然后放入当前字符串,即 dpArr[i - 1][j - zeroNum][k - oneNum] + 1)
311+
dpArr[i][j][k] = Math.max(dpArr[i - 1][j][k], dpArr[i - 1][j - zeroNum][k - oneNum] + 1);
312+
} else {
313+
// --if-- 无法放入第i个字符串,子集数量仍为 dpArr[i - 1][j][k]
314+
dpArr[i][j][k] = dpArr[i - 1][j][k];
315+
}
316+
}
317+
}
318+
}
319+
return dpArr[dpArr.length - 1][m][n];
320+
}
321+
}
322+
```
323+
324+
325+
326+
二维DP数组实现
327+
266328
```Java
267329
class Solution {
268330
public int findMaxForm(String[] strs, int m, int n) {
@@ -682,3 +744,4 @@ public class Solution
682744
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
683745
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
684746
</a>
747+

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /