📅  最后修改于: 2023-12-03 15:11:58.580000             🧑  作者: Mango
在这个问题中,给定一个正整数数组nums,要求找出是否存在两个不相交的子集P和Q,使得它们的和相等,并返回true或false。
例如:
输入: nums = [1, 5, 11, 5]
输出: true
解释: 子集 {1, 5, 5} 和 {11} 的和相等
本题可以使用动态规划(DP)的思路来解决。
以下是java的实现:
public boolean canPartition(int[] nums) {
int nums_sum = 0;
for(int n : nums) {
nums_sum += n;
}
if(nums_sum % 2 != 0) { // 如果数组和为奇数,不可能找到和相等的子集
return false;
}
nums_sum /= 2;
boolean[][] dp = new boolean[nums.length+1][nums_sum+1];
dp[0][0] = true;
for(int i = 1; i <= nums.length; i++) {
dp[i][0] = true;
}
for(int i = 1; i <= nums.length; i++) {
for(int j = 1; j <= nums_sum; j++) {
dp[i][j] = dp[i-1][j];
if(j >= nums[i-1]) {
dp[i][j] = dp[i][j] || dp[i-1][j-nums[i-1]];
}
}
}
return dp[nums.length][nums_sum];
}
时间复杂度:O(n*sum),其中n是数组nums的长度,sum是数组nums的和。因为需要填写一个大小为(n+1)×(sum+1)的二维数组。
空间复杂度:O(n*sum),因为需要填写一个大小为(n+1)×(sum+1)的二维数组。