【算法与数据结构】474、LeetCode一和零

文章目录

所有的LeetCode题解索引,可以看这篇文章------【算法和数据结构】LeetCode题解

一、题目

二、解法

  思路分析:本题要找strs数组的最大子集,这个子集最多含有 m m m个0和 n n n个1。本题也可以抽象成一个01背包的问题。其中,strs内的元素就是物品,而 m m m和 n n n就是背包的维度。 d p i j dpij dpij代表最多有i个0和j个1的strs的最大子集的大小。递归数组可以由 d p i j = m a x ( d p i j , d p i − z e r o N u m j − o n e N u m + 1 ) dpij = max(dpij, dpi - zeroNumj - oneNum + 1) dpij=max(dpij,dpi−zeroNumj−oneNum+1)得出。和文章【算法与数据结构】算法与数据结构知识点中的01背包滚动数组一样,循环需要从后往前进行,否则会将strs重复计算。

  程序如下:

cpp 复制代码
class Solution {
public:
	int findMaxForm(vector<string>& strs, int m, int n) {
		vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));	// 默认初始化为0
		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);
				}
			}
		}
		return dp[m][n];
	}
};

复杂度分析:

  • 时间复杂度: O ( K ∗ m ∗ n ) O(K*m*n) O(K∗m∗n),K为strs的长度。
  • 空间复杂度: O ( m ∗ n ) O(m*n) O(m∗n)。

三、完整代码

cpp 复制代码
# include <iostream>
# include <vector>
# include <string>
using namespace std;

class Solution {
public:
	int findMaxForm(vector<string>& strs, int m, int n) {
		vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));	// 默认初始化为0
		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);
				}
			}
		}
		return dp[m][n];
	}
};

int main() {
	Solution s1;
	vector<string> strs = { "10", "0001", "111001", "1", "0" };
	int m = 5;
	int n = 3;
	int result = s1.findMaxForm(strs, m, n);
	cout << result << endl;
	system("pause");
	return 0;
}

end

相关推荐
Asize17 分钟前
54. 螺旋矩阵
算法
Asize18 分钟前
73. 矩阵置零
算法
微露清风1 小时前
快慢指针算法学习记录
学习·算法·快慢指针
benchmark_cc2 小时前
1000只ETF的5分钟K线如何批量获取?QuantDash分页策略与高性能Python实践
开发语言·人工智能·爬虫·python·算法·quantdash·量化数据源
sel_92 小时前
【PEFT】参数高效微调(PEFT)技术详解:从原理到 LoRA/QLoRA 实战
人工智能·python·深度学习·算法·机器学习·参数高效微调
我星期八休息2 小时前
Linux I/O多路转接—epoll
java·linux·运维·服务器·开发语言·jvm·算法
阳明山水3 小时前
Mamba与两阶段XGBoost的融合架构:面向间歇性需求的双路径预测框架
人工智能·深度学习·算法·机器学习·架构
水上冰石3 小时前
【MuJoCo从入门到精通】第2章 第一个 MuJoCo 仿真
前端·人工智能·算法
wenyq73 小时前
LeetCode 2904. Shortest and Lexicographically Smallest Beautiful String
算法·leetcode
维克兜率天3 小时前
【维克】技术指标是什么:从均线到MACD的数学原理
人工智能·笔记·python·算法·量化