您的位置:首页 > 其它

Partition Equal Subset Sum解题报告

2017-12-17 17:57 337 查看
题目链接https://leetcode.com/problems/partition-equal-subset-sum/description/

题目描述如下

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:
Each of the array element will not exceed 100.
The array size will not exceed 200.
Example 1:

Input: [1, 5, 11, 5]

Output: true

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

Input: [1, 2, 3, 5]

Output: false

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


题目大意是要判断一个正整数数组是否可以分成和相等的两部分

我的想法是:

step1: 判断数组的和(sum)是否是偶数,只有偶数才可分
step2: 求出和的一半(n),若n小于数组最大值,则不可分
step3: 从数组最后一个数开始,判断包含或不包含当前元素的子集是否求和得n,这里用到递归的算法。


c++代码如下:

class Solution {
public:
bool canPartition(vector<int>& nums){
int len = nums.size();
int sum = 0;
int n = 0;
for(int i = 0; i < len; i++){
sum += nums[i];
}
if(sum % 2 != 0) {
<
4000
span class="hljs-keyword">return false;
}
n = sum / 2;
sort(nums.begin(),nums.end());
if(n < nums[len-1]){
return false;
}
return find(nums, len - 1, n);
}

bool find(vector<int>& nums, int end, int sum){
if(sum == 0){
return true;
}
if(sum < 0){
return false;
}
if(end == 0){
if(sum != nums[0]){
return false;
}
return true;
}else{
return find(nums, end-1, sum - nums[end]) || find(nums, end-1, sum);
}
}
};


复杂度是O(2n)的,不过这个算法在leetcode的测试数据集下收敛较快,所以3ms通过了测试。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: