My Seventy-second Page - 一和零 - By Nicolas

这篇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即可。

希望上面的代码可以帮助到小伙伴们~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值