Hard
ArrayBinary SearchDPBit Manipulation
Updated Sep 2026

Partition Array Into Two Arrays to Minimize Sum Difference

Asked at Salesforce

Problem

Partition an array of 2n elements into two groups of n elements each such that the absolute difference between their sums is minimized. This problem requires the meet-in-the-middle technique to achieve exponential optimization over brute force.

Asked At

CompanyDifficulty
SalesforceHardView all Salesforce questions →

How to Think About It

1.

Brute force: generate all subsets of size n from 2n elements. There are C(2n, n) such subsets, which is exponential. For each subset, compute the sum of both halves and track the minimum difference. Too slow for n >= 15.

2.

Key insight: split the array into two halves of n/2 elements each. Generate all possible subset sums for the left half and right half separately. This reduces the problem to combining two smaller subproblems.

3.

Meet in the middle: for the left half, generate all 2^(n/2) subset sums. For each subset size k, the right half must contribute n-k elements. For each possible k, sort the right half's subset sums for each subset size. Use binary search to find the complement that minimizes the difference.

4.

Visual walkthrough for array [1, 2, 3, 4, 5, 6] (n=3, total=21, target sum=10.5):
Left half: [1, 2, 3]. Subsets: {}->0, {1}->1, {2}->2, {3}->3, {1,2}->3, {1,3}->4, {2,3}->5, {1,2,3}->6.
Right half: [4, 5, 6]. Subsets: {}->0, {4}->4, {5}->5, {6}->6, {4,5}->9, {4,6}->10, {5,6}->11, {4,5,6}->15.
For subset of size 0 from left, need size 3 from right. Left sum=0, right sum=15. Diff = |21 - 215| = 9.
For subset of size 1 from left, need size 2 from right. Best: left=1, right=10. Diff = |21 - 2
(1+10)| = 1.
Track minimum across all combinations.

5.

Optimization: for each subset size from the left half, sort the corresponding subset size sums from the right half. Use binary search to find the value closest to (target - left_sum). This gives O(2^(n/2) * n) complexity instead of O(2^n).

Optimal Approach

Step 1: Split the array into left half (first n/2) and right half (remaining).
Step 2: Generate all subset sums for the left half, grouped by subset size. Store as left[size] = sorted list of sums.
Step 3: Generate all subset sums for the right half, grouped by subset size. Store as right[size] = sorted list of sums.
Step 4: For each subset size k from 0 to n:

  • Get left sums for size k and right sums for size n-k
  • For each left_sum, use binary search on right_sums to find the value closest to (total/2 - left_sum)
  • Update the minimum difference
    Step 5: Return the minimum difference found.

Walkthrough for [1, 2, 3, 4, 5, 6] (n=3, total=21):

  • Left = [1,2,3], Right = [4,5,6]
  • For k=1, need 2 from right. Left sums of size 1: [1, 2, 3]. Right sums of size 2: [9, 10, 11].
  • For left_sum=1, best right_sum = 10 (target=10). Diff = |21 - 2*(1+10)| = 1.
  • Result: 1 (partition [1,4,5] and [2,3,6] with sums 10 and 11).

Time: O(2^(n/2) * n) for generating and combining subset sums. Space: O(2^(n/2)) for storing subset sums.

What Trips People Up in Real Interviews

1.

Trying a brute force DP approach. A standard knapsack won't work because you need exactly n elements in each partition, not just any subset with sum close to target. The "exactly n elements" constraint makes meet-in-the-middle the right approach.

2.

Forgetting to group subset sums by subset size. When the left half takes k elements, the right half must take n-k elements. You cannot mix subset sums of different sizes. Group them separately.

3.

Not using binary search after sorting. Once you sort the right half's subset sums for each size, binary search is what makes the solution efficient. Without it, you're back to O(2^n).

4.

Confusing the target sum. The total sum of all elements is fixed. You want to split into two groups with sum as close to total/2 as possible. The minimum difference is total - 2*best_sum.

5.

Integer overflow with large sums. The problem says elements can be up to 10^7 and n up to 15, so the total sum can be up to 3*10^8. Use long long in C++ or long in Java to avoid overflow.

Solution Code

import bisect

def minimumDifference(nums):
    total = sum(nums)
    n = len(nums) // 2
    half = n

    def get_subset_sums(arr):
        size = len(arr)
        subsets = [[] for _ in range(size + 1)]
        for mask in range(1 << size):
            s = 0
            bits = 0
            for i in range(size):
                if mask & (1 << i):
                    s += arr[i]
                    bits += 1
            subsets[bits].append(s)
        for i in range(size + 1):
            subsets[i].sort()
        return subsets

    left = get_subset_sums(nums[:n])
    right = get_subset_sums(nums[n:])

    min_diff = total
    for k in range(n + 1):
        for ls in left[k]:
            target = total // 2 - ls
            j = bisect.bisect_left(right[n - k], target)
            for idx in [j - 1, j]:
                if 0 <= idx < len(right[n - k]):
                    rs = right[n - k][idx]
                    diff = abs(total - 2 * (ls + rs))
                    min_diff = min(min_diff, diff)
    return min_diff

Pro at DSA?

Test your skills with a real FAANG-style mock interview.

Start a Mock Interview →

Frequently Asked Questions

What is the Partition Array Into Two Arrays to Minimize Sum Difference problem?

Partition an array of 2n elements into two groups of n elements each such that the absolute difference between their sums is minimized. This problem requires the meet-in-the-middle technique to achieve exponential optimization over brute force.

How do you solve Partition Array Into Two Arrays to Minimize Sum Difference?

The optimal approach is described in detail above, including step-by-step walkthroughs, complexity analysis, and solution code in Python. Scroll up to the "Optimal Approach" section.

What companies ask Partition Array Into Two Arrays to Minimize Sum Difference?

Partition Array Into Two Arrays to Minimize Sum Difference is asked at Salesforce. It is a hard difficulty problem.

What are common mistakes on Partition Array Into Two Arrays to Minimize Sum Difference?
  • Trying a brute force DP approach. A standard knapsack won't work because you need exactly n elements in each partition, not just any subset with sum close to target. The "exactly n elements" constraint makes meet-in-the-middle the right approach.
  • Forgetting to group subset sums by subset size. When the left half takes k elements, the right half must take n-k elements. You cannot mix subset sums of different sizes. Group them separately.
  • Not using binary search after sorting. Once you sort the right half's subset sums for each size, binary search is what makes the solution efficient. Without it, you're back to `O(2^n)`.
  • Confusing the target sum. The total sum of all elements is fixed. You want to split into two groups with sum as close to total/2 as possible. The minimum difference is `total - 2*best_sum`.
  • Integer overflow with large sums. The problem says elements can be up to 10^7 and n up to 15, so the total sum can be up to 3*10^8. Use `long long` in C++ or `long` in Java to avoid overflow.