Partition Equal Subset Sum解题报告

来源:互联网 发布:淘宝转换微信链接 编辑:程序博客网 时间:2024/05/01 16:52

题目链接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: trueExplanation: The array can be partitioned as [1, 5, 5] and [11].Example 2:Input: [1, 2, 3, 5]Output: falseExplanation: 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) {                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通过了测试。

原创粉丝点击