【算法与数据结构】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 ] dp[i][j] dp[i][j]代表最多有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 ) dp[i][j] = max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1) dp[i][j]=max(dp[i][j],dp[izeroNum][joneNum]+1)得出。和文章【算法与数据结构】算法与数据结构知识点中的01背包滚动数组一样,循环需要从后往前进行,否则会将strs重复计算。
  程序如下

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(Kmn),K为strs的长度。
  • 空间复杂度: O ( m ∗ n ) O(m*n) O(mn)

三、完整代码

# 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

相关推荐

  1. Leetcode 474

    2024-01-22 13:04:02       31 阅读
  2. LeetCode 474.

    2024-01-22 13:04:02       14 阅读
  3. 动态规划 Leetcode 474

    2024-01-22 13:04:02       21 阅读
  4. 474. (力扣LeetCode

    2024-01-22 13:04:02       18 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-22 13:04:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-22 13:04:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-22 13:04:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-22 13:04:02       20 阅读

热门阅读

  1. C++入门【34-C++类成员函数】

    2024-01-22 13:04:02       25 阅读
  2. 代码随想录算法训练营29期Day25|LeetCode 216,17

    2024-01-22 13:04:02       36 阅读
  3. 9 | Tensorflow中的batch批处理

    2024-01-22 13:04:02       32 阅读
  4. SpringMVC 的理解

    2024-01-22 13:04:02       27 阅读
  5. MyBatis实战指南(三):常用注解及使用方法

    2024-01-22 13:04:02       37 阅读
  6. 重生之我从零开始学前后端——Week01

    2024-01-22 13:04:02       28 阅读