栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java 求解一和零

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java 求解一和零

文章目录
    • 一、题目
    • 二、背包解析
    • 三、代码
    • 四、总结

一、题目

给你一个二进制字符串数组 strs 和两个整数 m 和 n 。

请你找出并返回 strs 的最大子集的大小,该子集中 最多 有 m 个 0 和 n 个 1 。

如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集 。

二、背包解析

该题仍然可以按照背包问题去解析

字符串数组里的元素,可以看作物品

m和n相当于背包,两个维度的背包

(1)确定 dp 数组

dp[i][j] 表示 i 个零和 j 个一时最大子集数目

(2)确定递推表达式

dp[i][j]=Math.max(dp[i][j],dp[i-zeroNum][j-oneNum]+1)
表示字符串要么放,要么不放

(3)确定初始化

物品不会是负数,所以初始为0

(4)确定遍历顺序

这里虽然是二维数组,但是仍然是类似前面的一维数组,每次都覆盖上一行,所以从后往前遍历

三、代码
class Solution {
    public int findMaxForm(String[] strs, int m, int n) {
        //dp[i][j]表示i个0和j个1时的最大子集
        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];
    }
}
四、总结

该题重在转为背包问题去考虑

而且容量是两个维度

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/667664.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号