416. Partition Equal Subset Sum

Given a non-empty array containing only positive integers, find if the array can be partitioned into two subsets such that the sum of elements in both subsets is equal.

Note:

  1. Each of the array element will not exceed 100.
  2. The array size will not exceed 200.

Example 1:

1
2
3
4
5
Input: [1, 5, 11, 5]

Output: true

Explanation: The array can be partitioned as [1, 5, 5] and [11].

Example 2:

1
2
3
4
5
Input: [1, 2, 3, 5]

Output: false

Explanation: The array cannot be partitioned into equal sum subsets.

解法1:动态规划

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public:
bool canPartition(vector<int>& nums) {
int sum = 0;
for(int i=0;i<nums.size();++i){
sum += nums[i];
}
if(sum & 1){
return false;
}
sum >>= 1;
vector<bool> dp(sum + 1, false);
dp[0] = true;
for(int i=0;i<nums.size();++i){
for(int j=sum;j>=nums[i];--j){
dp[j] = dp[j] || dp[j- nums[i]];
}
}
return dp[sum];
}
};

时间复杂度:与nums.size()和target都相关。

解法2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
class Solution {
public:
bool canPartition(vector<int>& nums) {
int sum = 0;
bool res = false;
if(nums.size() < 2){
return false;
}
for(int i=0;i<nums.size();++i){
sum += nums[i];
}
if(sum & 1){
return false;
}
sort(nums.begin(), nums.end(), less<int>());
for(int i=0;i<nums.size();++i){
int tmp = sum >> 1;
int end = nums.size() - 1;
tmp = tmp - nums[i];
if(tmp == 0){
res = true;
}
while(i < end){
if(tmp - nums[end] > 0){
tmp = tmp - nums[end];
end--;
}else if(tmp - nums[end] < 0){
end--;
}else{
res = true;
end--;
}
}
}
return res;
}
};

时间复杂度:仅仅与nums.size()相关