18. Partition Equal Subset Sum
The problem can be found at the following link: Question Link
Problem Description
Given an array arr[], determine if it can be partitioned into two subsets such that the sum of elements in both parts is the same.
Each element must be in exactly one subset.
Examples
Example 1:
Input:
arr = [1, 5, 11, 5]Output:
TrueExplanation:
The array can be partitioned into [1, 5, 5] and [11], both having the sum 11.
Example 2:
Input:
Output:
Explanation:
There is no way to split the array into two subsets with equal sum.
Constraints:
$(1 \leq arr.size \leq 100)$
$(1 \leq arr[i] \leq 200)$
Optimized 1D Dynamic Programming
Approach:
Calculate the total sum of the array. If it's odd, return false (cannot be evenly split).
Use a DP table (
dp[j]), wheredp[j]tells if we can form sumj.Initialize
dp[0] = true, since a sum of 0 is always possible.Iterate through each element in the array:
Update
dp[j] = dp[j] OR dp[j - num]forj = targetdown tonum.
If
dp[target]is true, we can partition the array into two subsets with equal sum.
Time and Auxiliary Space Complexity
Expected Time Complexity: $O(N \times sum)$, as we iterate over the elements and process sums up to
sum/2.Expected Auxiliary Space Complexity: $O(sum)$, as we use a 1D DP array of size
sum/2 + 1.
Code (C++)
⚡ Alternative Approaches
2️⃣ Dynamic Programming (O(N×sum) Time, O(N×sum) Space) — 2D DP
Algorithm Steps:
Use a 2D DP table, where
dp[i][j]represents whether a subset with sumjcan be formed using the firstielements.Base Case:
dp[0][0] = true(sum 0 can be formed with zero elements).dp[i][0] = truefor alli(sum 0 is always achievable).
Recurrence Relation: $[ dp[i][j] = dp[i-1][j] \quad \text{(exclude element)} $] If
arr[i-1] ≤ j, then: $[ dp[i][j] = dp[i-1][j] \text{ OR } dp[i-1][j - arr[i-1]] $] (include element if possible).
✅ Time Complexity: O(N × sum)
✅ Space Complexity: O(N × sum)
3️⃣ Recursive + Memoization (O(N×sum) Time, O(N×sum) Space)
Algorithm Steps:
Define a recursive function
canPartition(i, target)that checks if a subset ofarr[0...i]sums up totarget.Base Cases:
If
target == 0, returntrue.If
i < 0ortarget < 0, returnfalse.
Recurrence Relation:
Exclude
arr[i]:canPartition(i - 1, target).Include
arr[i]ifarr[i] ≤ target:canPartition(i - 1, target - arr[i]).
Use Memoization (
dp[i][target]) to avoid redundant calculations.
✅ Time Complexity: O(N × sum)
✅ Space Complexity: O(N × sum) (recursion stack)
Comparison of Approaches
Approach
⏱️ Time Complexity
🗂️ Space Complexity
✅ Pros
⚠️ Cons
1D DP (Space Optimized)
🟡 O(N × sum)
🟢 O(sum/2)
Best space-efficient solution
Requires careful indexing
2D DP (Tabulation)
🟡 O(N × sum)
🔴 O(N × sum)
Intuitive approach
High space usage
Recursive + Memoization
🟡 O(N × sum)
🔴 O(N × sum)
Natural recursion flow
Stack overhead
✅ Best Choice?
If optimizing space: Use 1D DP (Space-Optimized).
If space is not a concern: Use 2D DP (Tabulation) for easier understanding.
For recursion lovers: Use Recursive + Memoization.
Code (Java)
Code (Python)
Contribution and Support:
For discussions, questions, or doubts related to this solution, feel free to connect on LinkedIn: Any Questions. Let’s make this learning journey more collaborative!
⭐ If you find this helpful, please give this repository a star! ⭐
📍Visitor Count
Last updated