2163. Minimum Difference in Sums After Removal of Elements
Description
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:
- The first
n
elements belonging to the first part and their sum issumfirst
. - The next
n
elements belonging to the second part and their sum issumsecond
.
The difference in sums of the two parts is denoted as sumfirst - sumsecond
.
- For example, if
sumfirst = 3
andsumsecond = 2
, their difference is1
. - Similarly, if
sumfirst = 2
andsumsecond = 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.
Constraints:
nums.length == 3 * n
1 <= n <= 105
1 <= nums[i] <= 105
Solutions
Solution: Priority Queue
- Time complexity: O(nlogn)
- Space complexity: O(n)
JavaScript
js
/**
* @param {number[]} nums
* @return {number}
*/
const minimumDifference = function (nums) {
const n = nums.length / 3;
const leftHeap = new MaxPriorityQueue();
const rightHeap = new MinPriorityQueue();
const minLeftSum = Array.from({ length: n * 3 }, () => null);
let leftSum = 0;
let rightSum = 0;
let result = Number.MAX_SAFE_INTEGER;
for (let index = 0; index < 2 * n; index++) {
const num = nums[index];
leftSum += num;
leftHeap.enqueue(num);
if (leftHeap.size() === n + 1) {
const maxNum = leftHeap.dequeue();
leftSum -= maxNum;
}
if (leftHeap.size() === n) {
minLeftSum[index] = leftSum;
}
}
for (let index = n * 3 - 1; index >= n; index--) {
const num = nums[index];
rightSum += num;
rightHeap.enqueue(num);
if (rightHeap.size() === n + 1) {
const minNum = rightHeap.dequeue();
rightSum -= minNum;
}
if (rightHeap.size() === n) {
const difference = minLeftSum[index - 1] - rightSum;
result = Math.min(difference, result);
}
}
return result;
};