0️⃣python数据结构与算法学习路线
学习内容:
- 基本算法:枚举、排序、搜索、递归、分治、优先搜索、贪心、双指针、动态规划等…
- 数据结构:字符串(string)、列表(list)、元组(tuple)、字典(dictionary)、集合(set)、数组、队列、栈、树、图、堆等…
题目:
给你一个二进制字符串数组 strs 和两个整数 m 和 n 。
请你找出并返回 strs 的最大子集的大小,该子集中 最多 有 m 个 0 和 n 个 1 。
如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集 。
输入输出:
输入: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 。
解题思路:
背包问题常规方法:
- 第 i 件物品没添加到背包,总体积不超过 j 的前 i 件物品的最大价值就是总体积不超过 j 的前 i-1 件物品的最大价值,dp[i][j] = dp[i-1][j]。
- 第 i 件物品添加到背包中,dp[i][j] = dp[i-1][j-w] + v。
在这道题的应用: - 统计每个数组的0和1数
- m相当于原问题中的容量
- n相当于原问题中的体积
- 最大数组数相当于价值
算法实现:
class Solution(object):
def findMaxForm(self, strs, m, n):
dp=[[0]*(n+1) for _ in range(m+1)] # 建立(n,m)的二维数组
for item in strs:
zeroNum=item.count('0')
oneNum=item.count('1')
for i in range(m,zeroNum-1, -1):
for j in range(n,oneNum-1, -1):
dp[i][j]=max(dp[i][j],dp[i-zeroNum][j-oneNum]+1)
return dp[-1][-1]
出现问题:
1.问题分类