Table of Contents
Problem Statement
The Partition to K Equal Sum Subsets LeetCode Solution – “Partition to K Equal Sum Subsets” states that you’re given the integer array nums and an integer k, return true if it is possible to have k non-empty subsets whose sums are all equal.
Example:
Input: nums = [4,3,2,3,5,2,1], k = 4
Output: true
Explanation:
- The sum of the input array is 20.
- Hence, we need to partition the array into 4 non-empty subsets each having sum of 5.
- One of the possible partition is: [[5], [1,4], [2,3], [2,3]].
Input: nums = [1,2,3,4], k = 3
Output: false
Explanation:
- The sum of the input array is 10, which is not divisible by 3.
- Hence, we cannot have a valid partition.
Approach
Idea:
- The main idea to solve this problem is to use Backtracking.
- First, we will sort the array in non-increasing order which will ensure that there would be less number of recursion calls(recursion branches) since there would be less change in the subset-sum.
- Find the sum and the sum of all the elements of the input array.
- If the sum is a multiple of k, then we can have k subsets whose sums are all equal.
- Otherwise, return false.
- Also, we would perform memoization of the results into a HashMap, which would improve the runtime complexity of the solution since it would avoid the same recursive calls again.
- So, we’ll check if the result for the current configuration is already stored in the hashmap, and return the cached result.
- For each element that is still not taken:
- Include the number into the current subset and set the current bit position as 1.
- We’ll make the recursive call for the next element.
- If this recursive call returns true, we had found the valid partition, hence return true here.
- Else, discard the current element by setting the current bit position as 0, and try the next element.
- When the current sum of the subset reaches the demand sum, start working over the next subset by decrementing the value of k.
- When k==1, which implies we have found all the subsets and the remaining elements must have the sum equal to the demand sum.
- We’ll memorize the result of this configuration(the elements which are taken) using the integer mask.
Code
Partition to K Equal Sum Subsets Leetcode C++ Solution:
class Solution {
public:
bool recurse(int currsum,int demandsum,int start,int k,int& mask,vector<int>& nums,unordered_map<int,int>& memo){
if(k==1){
return true;
}
if(currsum>demandsum){
return false;
}
if(memo.count(mask)){
return memo[mask];
}
if(currsum==demandsum and recurse(0,demandsum,0,k-1,mask,nums,memo)){
return memo[mask] = true;
}
for(int i=start;i<nums.size();i++){
if((1<<i)&mask){
continue;
}
mask |= (1<<i);
if(recurse(currsum+nums[i],demandsum,i+1,k,mask,nums,memo)){
return true;
}
mask ^= (1<<i);
}
return memo[mask] = false;
}
bool canPartitionKSubsets(vector<int>& nums, int k) {
int sum = accumulate(nums.begin(),nums.end(),0);
if(sum%k or nums.size()<k){
return false;
}
int mask = 0;
unordered_map<int,int> memo;
sort(nums.rbegin(),nums.rend());
return recurse(0,sum/k,0,k,mask,nums,memo);
}
};Partition to K Equal Sum Subsets Leetcode Java Solution:
class Solution {
public boolean canPartitionKSubsets(int[] nums, int k) {
int sum = 0;
for (int n : nums) sum += n;
if (sum % k != 0) return false;
if (nums.length < k) return false;
return canPartition(nums, new boolean[nums.length], 0, k, 0, sum / k);
}
private boolean canPartition(int[] nums, boolean[] used, int start, int k, int curSum, int subSum) {
if (k == 1) return true;
if (curSum > subSum) return false;
if (curSum == subSum) return canPartition(nums, used, 0, k - 1, 0, subSum);
for (int i = start; i < nums.length; i++) {
if (used[i]) continue;
used[i] = true;
if (canPartition(nums, used, i + 1, k, curSum + nums[i], subSum)) return true;
used[i] = false;
}
return false;
}
}Complexity Analysis for Partition to K Equal Sum Subsets Leetcode Solution
Time Complexity
The time complexity of the above code is O(N*2^N) when we use memoization with backtracking since there will be 2^N unique combinations of building a subset from an array of length N, in every combination the given array will be linearly iterated.
Space Complexity
The space complexity of the above code is O(2^N). There will be 2^N unique combinations of the integer mask which will be stored in the map, and the recursive stack will require O(N) space.