这篇page是针对leetcode上的474.一和零所写的。小尼先简单的说明一下这道题的意思,就是给出一个二进制字符串strs和两个整数m和n。需要找出并且返回strs的最大子集长度,改子集中有m个0和n个1。其实我们在这里也可以看作是一个动态规划的题目,小尼接下来给出动规五部曲:
1、确定dp数组以及下标的含义:dp[i][j]:最多有i个0和j个strs的最大子集的大小为dp[i][j]
2、确定递推公式:dp[i][j] = max(dp[i][j],dp[i-zeroNum][j-oneNum] + 1)
3、dp数组如何进行初始化:因为物品价值不会是负数,初始为0,保证递推的时候dp[i][j]不会被初始值覆盖
4、确定遍历顺序:我们定义的是一个二维数组,所以我们只需要是向前遍历即可,这里的遍历就没有先后之说。
5、推导出dp数组:最后就是我们只需要推导出dp数组即可
小尼接下来拉一下代码:
class Solution {
public int findMaxForm(String[] strs, int m, int n) {
int[][] dp = new int[m+1][n+1];
int oneNum, zeroNum;
for(String str : strs){
oneNum = 0;
zeroNum = 0;
for(char ch : str.toCharArray()){
if(ch == '0'){
zeroNum++;
}else{
oneNum++;
}
}
for(int i = m; i >=zeroNum; i--){
for(int j = n; j >= oneNum; j--){
dp[i][j] = Math.max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1);
}
}
}
return dp[m][n];
}
}
小尼简单的说明一下这里的记录问题,这里其实就是一个二维的记录,其实就是我们利用1的个数和0的个数做一个共同的记录而已,我们先定义完数组dp,然后我们开始取入数据,这里利用的也就是一个for循环进行递归取入,然后我们拿到了对应的数组中的数据之后,我们开始记录在这个数据中的1的个数和0的个数,记录完了个数之后,我们就开始进行两层for循环进行对应的遍历记录,我们两层for循环的遍历记录在我们,每一次进行新的遍历循环的时候,我们只需要对我们的个数进行一个对应添加的操作,一定需要记住的是,我们需要添加的的个数,记住是个数,我们的次多记录一个其实就是我们记录的个数多增加了一,所以我们直接就是在原来的基础上加一个1即可。
希望上面的代码可以帮助到小伙伴们~~~