LeetCode:474.一和零

跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的!
代码随想录
LeetCode:474.一和零

给你一个二进制字符串数组 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 。

  • 0-1背包求的是背包容量为j能装的最大价值
  • 分割等和子集求的是能否装满容量为target的背包
  • 最后一块石头的重量求的是容量为target的背包能装的最大重量是多少
  • 目标和求的是容量为target的背包装满有多少种方式,递推公式:dp[j] += dp[j - nums[i]]
  • 一和零求的是当背包容量是二维的时候能最多装多少个元素
  • 本题可以将m个0,n个1看成一种特殊的容器,可以直接转化为求这种特殊的容器最多能装满多少个元素
  • dp[i][j]i个0,j个1时最多能装dp[i][j]个元素
  • 递推公式:dp[i][j] = Math.max(dp[i][j], dp[i - zeroNum] + dp[j - oneNum] + 1,即不选当前元素时的值 和 选当前元素的值两种情况下取最大值,dp[i - zeroNum][j - oneNum] + 1意思是:先预留足够的空间,然后在加上当前的元素的个数1
  • 这里面背包的容量是二维的,需要同时考虑01的个数,而之前的0-1背包问题都是一维的
java 复制代码
	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];
    }
相关推荐
佛系打工仔6 分钟前
绘制K线第一章:可见区间处理
java
wangkay8812 分钟前
【Java 转运营】Day02:抖音直播间流量底层逻辑全解析
java·新媒体运营
im_AMBER15 分钟前
Leetcode 102 反转链表
数据结构·c++·学习·算法·leetcode·链表
5***b9723 分钟前
Spring Boot--@PathVariable、@RequestParam、@RequestBody
java·spring boot·后端
今儿敲了吗35 分钟前
01|多项式输出
c++·笔记·算法
AIGCExplore39 分钟前
Jenkins 全局配置及工具验证教程
java·servlet·jenkins
qq_3181215944 分钟前
Java大厂面试故事:Spring Boot、微服务与AI场景深度解析
java·spring boot·redis·微服务·ai·kafka·spring security
Xの哲學1 小时前
深入剖析Linux文件系统数据结构实现机制
linux·运维·网络·数据结构·算法
玛丽莲茼蒿1 小时前
javaSE 集合框架(五)——java 8新品Stream类
java·开发语言
程序员小假1 小时前
设计一个支持万人同时抢购商品的秒杀系统?
java·后端