力扣第474题 一和零 c++ 动态规划 01背包

这篇具有很好参考价值的文章主要介绍了力扣第474题 一和零 c++ 动态规划 01背包。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目

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 。

提示:

  • 1 <= strs.length <= 600
  • 1 <= strs[i].length <= 100
  • strs[i] 仅由 '0' 和 '1' 组成
  • 1 <= m, n <= 100

思路和解题方法

  • 定义一个二维动态规划数组 dp,其中 dp[i][j] 表示当背包容量为 i 个 0 和 j 个 1 时,所能选择的字符串的最大数量。
  • 对于每个字符串 str,统计其中 0 和 1 的数量,分别记为 zeroNum 和 oneNum
  • 使用双重循环遍历背包容量 i 和 j,从大到小遍历,以确保在更新 dp[i][j] 时使用的是上一轮循环中的值。具体地,在第二重循环中,对于当前的 i 和 j,有两种选择:
    • 不选择当前字符串,此时 dp[i][j] 不变;
    • 选择当前字符串,此时需要将 i 减去 zeroNum,将 j 减去 oneNum,并将 dp[i-zeroNum][j-oneNum] 加上 1,表示选择当前字符串后的最大数量。
  • 在双重循环结束后,dp[m][n] 即为所求。

复杂度

        时间复杂度:

                O(k*m*n)

        时间复杂度:该算法使用了二维动态规划数组,对于每个字符串需要遍历一次整个数组,因此时间复杂度为 O(k * m * n),其中 k = len(strs) 表示字符串数组的长度。

        空间复杂度

                O(m*n)

        空间复杂度:该算法使用了一个二维动态规划数组,因此空间复杂度为 O(m * n)。需要注意的是,在实际代码中,我们可以将二维数组优化为一维数组,从而将空间复杂度降低到 O(n)。

c++ 代码

class Solution {
public:
    int findMaxForm(vector<string>& strs, int m, int n) {
        // 创建动态规划数组 dp,大小为 (m+1) x (n+1),并将所有元素初始化为 0
        vector<vector<int>> dp (m+1,vector<int> (n+1,0));
        
        // 遍历字符串数组 strs
        for(string str :strs)
        {
            // 统计当前字符串中 0 和 1 的个数
            int oneNum = 0,zeroNum = 0;
            for(char c:str) if(c == '0') zeroNum++; else oneNum++;
            
            // 使用双重循环遍历动态规划数组 dp
            for(int i = m;i>=zeroNum;i--) // 遍历背包容量 m
                for(int j = n;j>=oneNum;j--) // 遍历背包容量 n
                {
                    // 如果当前字符串可以被放入背包中,更新 dp[i][j] 的值为 dp[i-zeroNum][j-oneNum] + 1
                    // 表示容量为 i、j 的背包所能装载的最大字符串数量
                    dp[i][j] = max(dp[i][j],dp[i-zeroNum][j-oneNum] + 1);
                }
        }
        
        // 返回容量为 m、n 的背包所能装载的最大字符串数量
        return dp[m][n];
    }
};

觉得有用的话可以点点赞,支持一下。

如果愿意的话关注一下。会对你有更多的帮助。

每天都会不定时更新哦  >人<  。文章来源地址https://www.toymoban.com/news/detail-741470.html

到了这里,关于力扣第474题 一和零 c++ 动态规划 01背包的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【十九】【动态规划】518. 零钱兑换 II、279. 完全平方数、474. 一和零,三道题目深度解析

    动态规划就像是解决问题的一种策略,它可以帮助我们更高效地找到问题的解决方案。这个策略的核心思想就是将问题分解为一系列的小问题,并将每个小问题的解保存起来。这样,当我们需要解决原始问题的时候,我们就可以直接利用已经计算好的小问题的解,而不需要重

    2024年02月03日
    浏览(40)
  • Day43|动态规划part05: 1049. 最后一块石头的重量 II、494. 目标和、474. 一和零

    本题物品的重量为stones[i],物品的价值也为stones[i]。 对应着01背包里的物品重量weight[i]和 物品价值value[i]。 确定dp数组以及下标的含义 dp[j]表示容量(这里说容量更形象,其实就是重量)为j的背包,最多可以背最大重量为dp[j] 。 确定递推公式 01背包的递推公式为:dp[j] = ma

    2024年04月23日
    浏览(47)
  • 【LeetCode题目详解】第九章 动态规划 part05 1049. 最后一块石头的重量 II 494. 目标和 474.一和零(day43补)

    有一堆石头,用整数数组  stones 表示。其中  stones[i] 表示第 i 块石头的重量。 每一回合,从中选出 任意两块石头 ,然后将它们一起粉碎。假设石头的重量分别为  x 和  y ,且  x = y 。那么粉碎的可能结果如下: 如果  x == y ,那么两块石头都会被完全粉碎; 如果  x != y

    2024年02月09日
    浏览(37)
  • 代码随想录Day36 动态规划05 LeetCode T1049最后一块石头的重量II T494 目标和 T474 一和零

    理论基础  : 代码随想录Day34 LeetCode T343整数拆分 T96 不同的二叉搜索树-CSDN博客 1.明白dp数组的含义 2.明白递推公式的含义 3.初始化dp数组 4.注意dp数组的遍历顺序 5.打印dp数组排错 题目链接:1049. 最后一块石头的重量 II - 力扣(LeetCode) 这题我们仍然采用动规五部曲来写,这题和

    2024年02月06日
    浏览(41)
  • 算法学习——LeetCode力扣动态规划篇3(494. 目标和、474. 一和零、518. 零钱兑换 II)

    494. 目标和 - 力扣(LeetCode) 描述 给你一个非负整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加 ‘+’ 或 ‘-’ ,然后串联起所有整数,可以构造一个 表达式 : 例如,nums = [2, 1] ,可以在 2 之前添加 ‘+’ ,在 1 之前添加 ‘-’ ,然后串联起来得到表达式 “

    2024年04月14日
    浏览(56)
  • 【LeetCode动态规划#07】01背包问题一维写法(状态压缩)实战,其二(目标和、零一和)

    力扣题目链接(opens new window) 难度:中等 给定一个非负整数数组,a1, a2, ..., an, 和一个目标数,S。现在你有两个符号 + 和 -。对于数组中的任意一个整数,你都可以从 + 或 -中选择一个符号添加在前面。 返回可以使最终数组和为目标数 S 的所有添加符号的方法数。 示例: 输入

    2023年04月18日
    浏览(63)
  • Leetcode 474 一和零

    题意理解 :         给你一个二进制字符串数组  strs  和两个整数  m  和  n  。         请你找出并返回  strs  的最大子集的长度,该子集中  最多  有  m  个  0  和  n  个  1  。         如果  x  的所有元素也是  y  的元素,集合  x  是集合  y  的 

    2024年01月17日
    浏览(36)
  • 474. 一和零

    目录 1、题目描述 2、思路:动态规划01背包 2.1、确定dp数组及下标含义 2.2、确定递归数组 2.3、初始化 2.4、确定遍历顺序 给你一个二进制字符串数组 strs 和两个整数 m 和 n 。 请你找出并返回 strs 的最大子集的长度,该子集中 最多 有 m 个 0 和 n 个 1 。 如果 x 的所有元素也是

    2024年02月03日
    浏览(22)
  • 【算法与数据结构】474、LeetCode一和零

    所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。    思路分析 :本题要找strs数组的最大子集,这个子集最多含有 m m m 个0和 n n n 个1。本题也可以抽象成一个01背包的问题。其中,strs内的元素就是物品,而 m m m 和 n n n 就是背包的维度。 d p [

    2024年01月22日
    浏览(41)
  • 力扣:494. 目标和(动态规划)(01背包)

    给你一个非负整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加 ‘+’ 或 ‘-’ ,然后串联起所有整数,可以构造一个 表达式 例如,nums = [2, 1] ,可以在 2 之前添加 ‘+’ ,在 1 之前添加 ‘-’ ,然后串联起来得到表达式 “+2-1” 。 返回可以通过上述方法构造的

    2024年01月21日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包