Partition Equal Subset Sum in DSA Typescript - Time & Space Complexity
We want to know how the time needed to check if an array can be split into two equal sum parts grows as the array gets bigger.
How does the number of steps change when the array size or sum increases?
Analyze the time complexity of the following code snippet.
function canPartition(nums: number[]): boolean {
const total = nums.reduce((a, b) => a + b, 0);
if (total % 2 !== 0) return false;
const target = total / 2;
const dp = new Array(target + 1).fill(false);
dp[0] = true;
for (const num of nums) {
for (let j = target; j >= num; j--) {
dp[j] = dp[j] || dp[j - num];
}
}
return dp[target];
}
This code checks if the array can be split into two parts with equal sums using a dynamic programming approach.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Nested loops where the outer loop goes through each number and the inner loop goes through possible sums up to half the total.
- How many times: Outer loop runs once per number (n times), inner loop runs up to target sum (s times).
As the number of elements (n) or the target sum (s) grows, the steps increase roughly by multiplying these two.
| Input Size (n) | Approx. Operations (n * s) |
|---|---|
| 10 (sum ~ 50) | ~ 10 * 25 = 250 |
| 100 (sum ~ 500) | ~ 100 * 250 = 25,000 |
| 1000 (sum ~ 5000) | ~ 1000 * 2500 = 2,500,000 |
Pattern observation: The steps grow roughly by multiplying the number of elements and half the total sum, so it grows faster if either increases.
Time Complexity: O(n * s)
This means the time needed grows with both the number of elements and the half of the total sum.
[X] Wrong: "The time depends only on the number of elements (n)."
[OK] Correct: The sum value also affects how many steps the inner loop runs, so both n and the sum matter.
Understanding this time complexity helps you explain how dynamic programming balances between input size and value range, a key skill in problem solving.
"What if we used a recursive approach with memoization instead of this bottom-up method? How would the time complexity change?"
Practice
Partition Equal Subset Sum problem ask you to find?Solution
Step 1: Understand the problem goal
The problem asks whether the given array can be divided into two parts where the sum of elements in both parts is the same.Step 2: Clarify what is being checked
It is not about duplicates, sorting, or count of elements, but about equal sum partitioning.Final Answer:
If the array can be split into two subsets with equal sums -> Option AQuick Check:
Partition Equal Subset Sum = Split into equal sum subsets [OK]
- Thinking it checks for duplicates
- Confusing with sorting problems
- Assuming it checks array length parity
Solution
Step 1: Identify correct parameter type
The input is an array of numbers, sonums: number[]is correct.Step 2: Identify correct return type
The function returns true or false, so return type isboolean.Final Answer:
function canPartition(nums: number[]): boolean -> Option DQuick Check:
Input array of numbers, output boolean [OK]
- Using wrong input type like string or boolean array
- Returning number instead of boolean
- Incorrect function signature syntax
function canPartition(nums: number[]): boolean {
const total = nums.reduce((a, b) => a + b, 0);
if (total % 2 !== 0) return false;
const target = total / 2;
const dp = new Array(target + 1).fill(false);
dp[0] = true;
for (const num of nums) {
for (let j = target; j >= num; j--) {
dp[j] = dp[j] || dp[j - num];
}
}
return dp[target];
}
console.log(canPartition([1, 5, 11, 5]));Solution
Step 1: Calculate total sum and check parity
The sum is 1+5+11+5 = 22, which is even, so continue.Step 2: Use dynamic programming to check subset sum
The code checks if a subset sums to 11 (half of 22). The subset [11] or [5,5,1] sums to 11, so dp[11] becomes true.Final Answer:
true -> Option BQuick Check:
Sum even and subset exists = true [OK]
- Not checking if total sum is even
- Confusing dp array update direction
- Assuming false because of large numbers
function canPartition(nums: number[]): boolean {
const total = nums.reduce((a, b) => a + b);
if (total % 2 !== 0) return false;
const target = total / 2;
const dp = new Array(target + 1).fill(false);
dp[0] = true;
for (const num of nums) {
for (let j = num; j <= target; j++) {
dp[j] = dp[j] || dp[j - num];
}
}
return dp[target];
}Solution
Step 1: Check reduce usage
Reduce lacks initial value, but if array is non-empty, it works. Not the main bug.Step 2: Check inner loop direction
The inner loop runs from num to target increasing, but it should run backward from target down to num to avoid using updated dp values in the same iteration.Final Answer:
Loop direction in inner for loop should be reversed -> Option CQuick Check:
Inner loop must go backward to avoid dp overwrite [OK]
- Not reversing inner loop causes wrong dp updates
- Assuming reduce always needs initial value
- Ignoring dp array size correctness
[2, 2, 3, 7], which of the following subsets can be one half of the partition if the array can be split into two equal sum subsets?Solution
Step 1: Calculate total sum
Sum = 2 + 2 + 3 + 7 = 14. Half sum = 7.Step 2: Find subset summing to 7
Check each option:
A: [2,3] = 5 ≠ 7
B: [2,2,3] = 7 == 7
C: [5] = 5 ≠ 7 (5 not in array)
D: [3,5] = 8 ≠ 7 (5 not in array)
B works, with remaining [7] also 7.Final Answer:
[2, 2, 3] -> Option AQuick Check:
Sum half is 7, B sums to 7 [OK]
- Not calculating half sum correctly
- Choosing subsets that don't sum to half
- Ignoring that partition may not exist
Ready to prove it?
Pass the test and this pattern moves unknown
