当前位置: 首页 > wzjs >正文

番禺网站建设公司百度搜索 手机

番禺网站建设公司,百度搜索 手机,平阳县城乡规划建设局网站,提供网站建设教程的网站leetcode:474. 一和零 - 力扣(LeetCode) 题目 给你一个二进制字符串数组 strs 和两个整数 m 和 n 。 请你找出并返回 strs 的最大子集的大小,该子集中 最多 有 m 个 0 和 n 个 1 。 如果 x 的所有元素也是 y 的元素,集合 x 是…

leetcode:474. 一和零 - 力扣(LeetCode)

题目

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

思路

strs里面的每个元素就是物品,只不过物品的容量有两个维度,背包的容量也有两个维度。

动规五部曲

(1)dp[i][j]:最多有i个0,j个1的strs的最大子集的大小为dp[i][j]

(2)递推公式:

dp[i][j] 可以由前一个strs里的字符串推导出来,strs里的字符串有zeroNum个0,oneNum个1。

dp[i][j] 就可以是 dp[i - zeroNum][j - oneNum] + 1。

然后我们在遍历的过程中,取dp[i][j]的最大值。

所以递推公式:dp[i][j] = max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1);

(3)根据定义,最多有0个0,0个1,这就根本没有子集,所以dp[0][0]=0。

(4)物品就是strs里的字符串,背包容量就是题目描述中的m和n。

先遍历物品,然后倒序遍历背包,只是背包这里需要两个for循环来遍历两个维度的变量。

代码如下:

for (string str : strs) { // 遍历物品int oneNum = 0, zeroNum = 0;for (char c : str) {if (c == '0') zeroNum++;else oneNum++;}for (int i = m; i >= zeroNum; i--) { // 遍历背包容量且从后向前遍历!for (int j = n; j >= oneNum; j--) {dp[i][j] = max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1);}}
}

外层for循环遍历物品,同时在每次遍历过程中记录zeroNum和oneNum。

内层循环是个双重for循环,遍历二维的背包。(这里的两个for循环顺序无所谓,因为他们是同一个变量的两个维度)。

代码如下:

#include <iostream>
#include <vector>
using namespace std;class Solution
{
public:/*** 寻找最多可以形成多少个具有等量0和1的子串** @param strs 字符串数组,每个字符串只包含"0"和"1"* @param m 可以使用的0的数量* @param n 可以使用的1的数量* @return 最多可以形成的子串数量** 动态规划解法:* - 使用二维数组dp[i][j]表示在i个0和j个1的条件下,最多可以形成的子串数量* - 遍历每个字符串,计算包含0和1的数量,然后更新dp数组* - 为了防止重复计算,需要从大到小遍历背包容量*/int findMaxForm(vector<string> &strs, int m, int n){// 初始化dp数组,所有值默认为0vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));for (string str : strs){ // 遍历物品int oneNum = 0, zeroNum = 0;// 首先统计字符串中0和1的个数(也就是物品的容量)for (char c : str){if (c == '0'){zeroNum++;}else{oneNum++;}}// 遍历背包,从后向前for (int i = m; i >= zeroNum; i--){for (int j = n; j >= oneNum; j--){// 更新dp数组,选择当前字符串时,子串数量的最大值dp[i][j] = max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1);}}}// 返回m个0和n个1时,最多可以形成的子串数量return dp[m][n];}
};

总结

理解起来很怪,后面要重新看一下讲解视频,两个维度倒是可以理解。

参考资料

 代码随想录

http://www.dtcms.com/wzjs/245620.html

相关文章:

  • 深圳网站建设汤小巧企业网站有哪些
  • 做seo网站诊断书怎么做百度搜索资源
  • 佛山做网站需要多少钱网站域名解析ip
  • 公司网站建设制作难么网站推广引流
  • 网站建设目标 优帮云网站制作的费用
  • 做网站找哪里网站优化查询代码
  • 四站合一网站制作网址收录大全
  • 易思腾网站建设百度搜索指数排行榜
  • 建设网站用哪个好seo平台
  • h5网站源代码怎么百度推广
  • 搜索网站哪个好软文推荐
  • wordpress搬家lnmpseo是免费的吗
  • 免费网站模板如何在百度打广告
  • 中国建设部官方网站监理转注册免费发帖的网站
  • 免费的网站在线客服软件seo公司怎样找客户
  • 企业网站推广的方法有哪几种网络营销的优势有哪些?
  • 做购物商城类网站需要线上营销活动有哪些
  • 用织梦做模板网站优化设计三年级上册答案语文
  • 东营 网站 建设厨师培训机构 厨师短期培训班
  • 阳江网站制作qq推广
  • 网站广告通栏效果注册城乡规划师含金量
  • wordpress如何安装网站主题seo网站关键词优化排名
  • 网站开发空间小永州网络推广
  • 怎么做本地婚姻介绍网站安阳企业网站优化外包
  • 福州专业做网站的公司建站工具
  • 网站开发模块seo搜索引擎优化是什么
  • 秦皇岛优化网站排名东莞整站优化
  • 室内设计师网络接单360搜索关键词优化软件
  • 中国最早做网站是谁重庆网页搜索排名提升
  • 1g1m wordpress哪家网站优化公司好