Skip to content

Commit 5848599

Browse files
authored
Update 3013-divide-an-array-into-subarrays-with-minimum-cost-ii.js
1 parent a96b158 commit 5848599

File tree

1 file changed

+83
-0
lines changed

1 file changed

+83
-0
lines changed

3013-divide-an-array-into-subarrays-with-minimum-cost-ii.js

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,86 @@
1+
/**
2+
* @param {number[]} nums
3+
* @param {number} k
4+
* @param {number} dist
5+
* @return {number}
6+
*/
7+
var minimumCost = function (nums, k, dist) {
8+
// store k-1 smallest elements
9+
const maxHeap = new PriorityQueue({ compare: (a, b) => b - a })
10+
// store dist - k + 1 biggest elements
11+
const minHeap = new PriorityQueue({ compare: (a, b) => a - b })
12+
const maxDiscard = {}
13+
const minDiscard = {}
14+
let sum = nums[0]
15+
let start = 1
16+
let end = start
17+
while (end - start < k - 1) {
18+
maxHeap.enqueue(nums[end])
19+
sum += nums[end]
20+
end++
21+
}
22+
// now there are k-1 elemetns in the Max heap
23+
while (end - start <= dist) {
24+
maxHeap.enqueue(nums[end])
25+
sum += nums[end]
26+
let dequeued = maxHeap.dequeue()
27+
sum -= dequeued
28+
minHeap.enqueue(dequeued)
29+
end++
30+
}
31+
32+
let minSum = sum
33+
while (end < nums.length) {
34+
if (k - 2 === dist) {
35+
sum += nums[end++]
36+
sum -= nums[start++]
37+
} else {
38+
discardMin()
39+
40+
if (nums[start] < minHeap.front()) {
41+
maxDiscard[nums[start]] = 1 + (maxDiscard[nums[start]] ?? 0)
42+
sum -= nums[start]
43+
44+
sum += minHeap.front()
45+
maxHeap.enqueue(minHeap.dequeue())
46+
} else minDiscard[nums[start]] = 1 + (minDiscard[nums[start]] ?? 0)
47+
48+
maxHeap.enqueue(nums[end])
49+
sum += nums[end]
50+
51+
discardMax()
52+
sum -= maxHeap.front()
53+
minHeap.enqueue(maxHeap.dequeue())
54+
55+
end++
56+
start++
57+
}
58+
minSum = Math.min(minSum, sum)
59+
}
60+
61+
function discardMax() {
62+
if (maxHeap.isEmpty()) return
63+
64+
while (maxDiscard[maxHeap.front()]) {
65+
maxDiscard[maxHeap.front()]--
66+
maxHeap.dequeue()
67+
}
68+
}
69+
function discardMin() {
70+
if (minHeap.isEmpty()) return
71+
72+
while (minDiscard[minHeap.front()]) {
73+
minDiscard[minHeap.front()]--
74+
minHeap.dequeue()
75+
}
76+
}
77+
78+
return minSum
79+
}
80+
81+
// another
82+
83+
184
//#region AVL Tree
285
/**
386
* @typedef {"keep-all" | "override" | "ignore"} DuplicateMode

0 commit comments

Comments
 (0)