美文网首页
474. 一和零[Python]

474. 一和零[Python]

作者: 玖月晴 | 来源:发表于2020-10-26 10:54 被阅读0次

题目

难度:★★★☆☆
类型:数组
方法:动态规划

力扣链接请移步本题传送门
更多力扣中等题的解决方案请移步力扣中等题目录

给你一个二进制字符串数组 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 <= 600
1 <= strs[i].length <= 100
strs[i] 仅由 '0' 和 '1' 组成
1 <= m, n <= 100

解答

这是典型的零一背包问题的变体。首先来回顾一下零一背包
,这道题目变化的是,限制从一个变成了两个,因此我们可以考虑建立二维dp数组。

数组定义:定义一个mxn维的数组dp,其中dp[i][j]表示在最大0的个数为i,1的个数为j时,最大子集的个数。

初始状况:dp数组所有元素都初始化为零。

递推公式:当某一个字符串中零和一的个数都不超过最大限制的个数(zero_max,one_max)时,更新:
dp[zero_max][one_max] = max(dp[zero_max][one_max], dp[zero_max-zero_num][one_max-one_num]+1)

最终情况:选择dp数组最右下角的结果即可。

【思考】遍历过程为什么需要逆序?

class Solution:
    def findMaxForm(self, strs, m: int, n: int) -> int:
        dp = [[0 for _ in range(n+1)] for _ in range(m+1)]

        for s in strs:
            zero_num, one_num = s.count('0'), s.count('1')
            for zero_max in reversed(range(0, m+1)):
                for one_max in reversed(range(0, n+1)):
                    if zero_num <= zero_max and one_num <= one_max:
                        dp[zero_max][one_max] = max(dp[zero_max][one_max], dp[zero_max-zero_num][one_max-one_num]+1)
        return dp[-1][-1]

如有疑问或建议,欢迎评论区留言~

有关更多力扣中等题的python解决方案,请移步力扣中等题解析

相关文章

  • 474. 一和零[Python]

    题目 难度:★★★☆☆类型:数组方法:动态规划 力扣链接请移步本题传送门[https://leetcode-cn....

  • 474. 一和零

    【Description】在计算机界中,我们总是追求用有限的资源获取最大的收益。 现在,假设你分别支配着 m 个 ...

  • 474. 一和零

    使用滚动数组法来优化空间复杂度

  • LeetCode 474. 一和零

    1、题目 一和零 - 力扣(LeetCode) https://leetcode-cn.com/problems/...

  • LeetCode 474. 一和零

    题目 给你一个二进制字符串数组 strs 和两个整数 m 和 n 。请你找出并返回 strs 的最大子集的长度,该...

  • 0-1背包:474. 一和零(中等)

    给你一个二进制字符串数组 strs 和两个整数 m 和 n 。 请你找出并返回 strs 的最大子集的大小,该子集...

  • LeetCode 474 一和零

    题目 一和零 题目内容 在计算机界中,我们总是追求用有限的资源获取最大的收益。现在,假设你分别支配着 m 个 0 ...

  • 动态十:一和零

    题目地址: https://leetcode-cn.com/problems/ones-and-zeroes/[...

  • 零基础学python(4)程序出题

    零基础学python(1)python的下载安装和运行零基础学python(2)四则运算计算器零基础学python...

  • 背包系列问题4——二维背包

    参考资料:1. 动态规划之背包问题系列2. #### 一和零

网友评论

      本文标题:474. 一和零[Python]

      本文链接:https://www.haomeiwen.com/subject/mxhamktx.html