当前位置:网站首页>LeetCode_474_一和零
LeetCode_474_一和零
2022-07-29 19:31:00 【Fitz1318】
题目链接
题目描述
给你一个二进制字符串数组 strs 和两个整数 m 和 n 。
请你找出并返回 strs 的最大子集的长度,该子集中 最多 有 m 个 0 和 n 个 1 。
如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集 。
示例 1:
输入:strs = ["10", "0001", "111001", "1", "0"], m = 5, n = 3
输出:4
解释:最多有 5 个 0 和 3 个 1 的最大子集是 {
"10","0001","1","0"} ,因此答案是 4 。
其他满足题意但较小的子集包括 {
"0001","1"} 和 {
"10","1","0"} 。{
"111001"} 不满足题意,因为它含 4 个 1 ,大于 n 的值 3 。
示例 2:
输入:strs = ["10", "0", "1"], m = 1, n = 1
输出:2
解释:最大的子集是 {
"0", "1"} ,所以答案是 2 。
提示:
1 <= strs.length <= 6001 <= strs[i].length <= 100strs[i]仅由'0'和'1'组成1 <= m, n <= 100
解题思路
动态规划
- str数组里面的元素相当于物品,每个物品都只有一个
- m和n相当于两个维度的背包
动态规划五部曲
确定
dp数组和下标的含义dp[i][j]:最多有i个0和j个1的str的最大子集的大小
确定递推公式
dp[i][j] = Math,max(dp[i][j],dp[i - num0][j - num1] + 1)
dp数组初始化
- 因为物品价值不会是负数,所以初始为0即可
确定遍历顺序
- 外层for循环遍历物品,内层for循环从后往前遍历背包容量
举例推到dp数组

AC代码
class Solution {
public int findMaxForm(String[] strs, int m, int n) {
int[][] dp = new int[m + 1][n + 1];
int num0;
int num1;
dp[0][0] = 0;
for (String str : strs) {
num0 = 0;
num1 = 0;
for (char c : str.toCharArray()) {
if (c == '0') {
num0++;
} else {
num1++;
}
}
for (int i = m; i >= num0; i--) {
for (int j = n; j >= num1; j--) {
dp[i][j] = Math.max(dp[i][j], dp[i - num0][j - num1] + 1);
}
}
}
return dp[m][n];
}
}
边栏推荐
猜你喜欢
随机推荐
updatexml、extractvalue和floor报错注入原理
接口测试工具之Postman详解
PromptBERT: Improving BERT Sentence Embeddings with Prompts
mnist有多少张图片(怎么读取图片文字)
Chrome - Plugin Recommendations
专家建议|经济低迷周期下如何制订求存的增长战略
直播预约 | 如何通过MLOps解放和提升AI生产力?
学校安全管理专题培训实施方案
MATLAB程序设计与应用 2. 第2章 MATLAB数据及其运算 2.1 MATLAB数值数据 && 2.2 MATLAB矩阵的表示 && 2.3 变量及其操作
ESP8266-Arduino编程实例-I2C设备地址扫描
无代码开发平台角色设置入门教程
Typescript mix method to class with decorator
H265码流RTP封装方式详解
TDengine 落地协鑫能科,数百亿数据压缩至 600GB
程序员如何提升自己写代码的能力?
安全浏览器将拥有这些隐藏功能,让你玩转浏览器
webUI测试框架设计思路详解
LeetCode #88.合并两个有序数组
【AutoSAR 五 方法论】
C # CLI (common language infrastructure)








