You are given a 0-indexed integer array nums
consisting of 3 * n
elements.
You are allowed to remove any subsequence of elements of size exactly n
from nums
. The remaining 2 * n
elements will be divided into two equal parts:
n
elements belonging to the first part and their sum is sum_first
.n
elements belonging to the second part and their sum is sum_second
.The difference in sums of the two parts is denoted as sum_first - sum_second
.
sum_first = 3
and sum_second = 2
, their difference is 1
.sum_first = 2
and sum_second = 3
, their difference is -1
.Return the minimum difference possible between the sums of the two parts after the removal of n
elements.
Example 1:
Input: nums = [3,1,2]
Output: -1
Explanation: Here, nums has 3 elements, so n = 1.
Thus we have to remove 1 element from nums and divide the array into two equal parts.
- If we remove nums[0] = 3, the array will be [1,2]. The difference in sums of the two parts will be 1 - 2 = -1.
- If we remove nums[1] = 1, the array will be [3,2]. The difference in sums of the two parts will be 3 - 2 = 1.
- If we remove nums[2] = 2, the array will be [3,1]. The difference in sums of the two parts will be 3 - 1 = 2.
The minimum difference between sums of the two parts is min(-1,1,2) = -1.
Example 2:
Input: nums = [7,9,5,8,1,3]
Output: 1
Explanation: Here n = 2. So we must remove 2 elements and divide the remaining array into two parts containing two elements each.
If we remove nums[2] = 5 and nums[3] = 8, the resultant array will be [7,9,1,3]. The difference in sums will be (7+9) - (1+3) = 12.
To obtain the minimum difference, we should remove nums[1] = 9 and nums[4] = 1. The resultant array becomes [7,5,8,3]. The difference in sums of the two parts is (7+5) - (8+3) = 1.
It can be shown that it is not possible to obtain a difference smaller than 1.
A brute-force solution would involve generating all possible subsequences of size n
from the input array nums
. For each subsequence, we would remove it from nums
, then divide the remaining elements into two equal parts of size n
. We would calculate the difference between the sums of these two parts and keep track of the minimum difference found so far.
This approach has a high time complexity due to the need to generate all possible subsequences, making it impractical for large input sizes.
A more efficient solution can be achieved using prefix and suffix sums along with priority queues (min-heap and max-heap).
2n
elements of nums
. Maintain a max-heap of size n
. For each element, add it to the heap and the prefix sum. If the heap size exceeds n
, remove the largest element from the heap and subtract it from the prefix sum. This ensures we always have the sum of the smallest n
elements seen so far.2n
elements of nums
in reverse order. Maintain a min-heap of size n
. For each element, add it to the heap and the suffix sum. If the heap size exceeds n
, remove the smallest element from the heap and subtract it from the suffix sum. This ensures we always have the sum of the largest n
elements seen so far.n
to 2n
. For each index i
, the prefix sum up to i - 1
represents the sum of the smallest n
elements in nums[0...i-1]
, and the suffix sum from i
represents the sum of the largest n
elements in nums[i...3n-1]
. Calculate the difference between the prefix sum and the suffix sum, and update the minimum difference.import heapq
def minDifference(nums):
n = len(nums) // 3
# Prefix sums
prefix_sums = [0] * (2 * n + 1)
max_heap = []
prefix_sum = 0
for i in range(2 * n):
heapq.heappush(max_heap, -nums[i])
prefix_sum += nums[i]
if len(max_heap) > n:
prefix_sum += heapq.heappop(max_heap)
prefix_sums[i + 1] = prefix_sum
# Suffix sums
suffix_sums = [0] * (2 * n + 1)
min_heap = []
suffix_sum = 0
for i in range(3 * n - 1, n - 1, -1):
heapq.heappush(min_heap, nums[i])
suffix_sum += nums[i]
if len(min_heap) > n:
suffix_sum -= heapq.heappop(min_heap)
suffix_sums[3 * n - i] = suffix_sum
suffix_sums.reverse()
# Calculate minimum difference
min_diff = float('inf')
for i in range(n, 2 * n + 1):
min_diff = min(min_diff, prefix_sums[i] - suffix_sums[i])
return min_diff