1、题目详解
https://leetcode-cn.com/problems/partition-equal-subset-sum/
给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
- 每个数组中的元素不会超过 100
- 数组的大小不会超过 200
2、代码详解
空间复杂度是O(n×target),时间复杂度是O(n×target)
0−1背包问题
class Solution(object):
def canPartition(self, nums):
"""
:type nums: List[int]
:rtype: bool
"""
n = len(nums)
if n < 2:
return False
if sum(nums)%2 != 0:
return False
target = sum(nums)//2 # 总和一半
if max(nums) > target:
return False
# 从数组的[0,i]下标范围内选取若干个正整数(可以是0个),是否存在一种选取方案使得被选取的正整数的和等于j
dp = [[False] * (target+1) for _ in range(n)]
for i in range(n):
dp[i][0] = True
dp[0][nums[0]] = True # 当 i==0 时,只有一个正整数nums[0] 可以被选取
for i in range(1, n):
for j in range(1, target+1):
if j >= nums[i]:
dp[i][j] = dp[i-1][j] or dp[i-1][j-nums[i]]
else:
dp[i][j] = dp[i-1][j]
return dp[n-1][target]