Skip to content

Commit 2e5b60f

Browse files
authored
feat: add js solution to lc problem: No.3430 (#3994)
1 parent 586c35f commit 2e5b60f

File tree

3 files changed

+283
-0
lines changed

3 files changed

+283
-0
lines changed

Diff for: solution/3400-3499/3430.Maximum and Minimum Sums of at Most Size K Subarrays/README.md

+96
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,102 @@ tags:
192192

193193
```
194194

195+
#### JavaScript
196+
197+
```js
198+
/**
199+
* @param {number[]} nums
200+
* @param {number} k
201+
* @return {number}
202+
*/
203+
var minMaxSubarraySum = function (nums, k) {
204+
const computeSum = (nums, k, isMin) => {
205+
const n = nums.length;
206+
const prev = Array(n).fill(-1);
207+
const next = Array(n).fill(n);
208+
let stk = [];
209+
210+
if (isMin) {
211+
for (let i = 0; i < n; i++) {
212+
while (stk.length > 0 && nums[stk[stk.length - 1]] >= nums[i]) {
213+
stk.pop();
214+
}
215+
prev[i] = stk.length > 0 ? stk[stk.length - 1] : -1;
216+
stk.push(i);
217+
}
218+
stk = [];
219+
for (let i = n - 1; i >= 0; i--) {
220+
while (stk.length > 0 && nums[stk[stk.length - 1]] > nums[i]) {
221+
stk.pop();
222+
}
223+
next[i] = stk.length > 0 ? stk[stk.length - 1] : n;
224+
stk.push(i);
225+
}
226+
} else {
227+
for (let i = 0; i < n; i++) {
228+
while (stk.length > 0 && nums[stk[stk.length - 1]] <= nums[i]) {
229+
stk.pop();
230+
}
231+
prev[i] = stk.length > 0 ? stk[stk.length - 1] : -1;
232+
stk.push(i);
233+
}
234+
stk = [];
235+
for (let i = n - 1; i >= 0; i--) {
236+
while (stk.length > 0 && nums[stk[stk.length - 1]] < nums[i]) {
237+
stk.pop();
238+
}
239+
next[i] = stk.length > 0 ? stk[stk.length - 1] : n;
240+
stk.push(i);
241+
}
242+
}
243+
244+
let totalSum = 0;
245+
for (let i = 0; i < n; i++) {
246+
const left = prev[i];
247+
const right = next[i];
248+
const a = left + 1;
249+
const b = i;
250+
const c = i;
251+
const d = right - 1;
252+
253+
let start1 = Math.max(a, i - k + 1);
254+
let endCandidate1 = d - k + 1;
255+
let upper1 = Math.min(b, endCandidate1);
256+
257+
let sum1 = 0;
258+
if (upper1 >= start1) {
259+
const termCount = upper1 - start1 + 1;
260+
const first = start1;
261+
const last = upper1;
262+
const indexSum = (last * (last + 1)) / 2 - ((first - 1) * first) / 2;
263+
const constantSum = (k - i) * termCount;
264+
sum1 = indexSum + constantSum;
265+
}
266+
267+
let start2 = upper1 + 1;
268+
let end2 = b;
269+
start2 = Math.max(start2, a);
270+
end2 = Math.min(end2, b);
271+
272+
let sum2 = 0;
273+
if (start2 <= end2) {
274+
const count = end2 - start2 + 1;
275+
const term = d - i + 1;
276+
sum2 = term * count;
277+
}
278+
279+
totalSum += nums[i] * (sum1 + sum2);
280+
}
281+
282+
return totalSum;
283+
};
284+
285+
const minSum = computeSum(nums, k, true);
286+
const maxSum = computeSum(nums, k, false);
287+
return minSum + maxSum;
288+
};
289+
```
290+
195291
<!-- tabs:end -->
196292

197293
<!-- solution:end -->

Diff for: solution/3400-3499/3430.Maximum and Minimum Sums of at Most Size K Subarrays/README_EN.md

+96
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,102 @@ tags:
189189

190190
```
191191

192+
#### JavaScript
193+
194+
```js
195+
/**
196+
* @param {number[]} nums
197+
* @param {number} k
198+
* @return {number}
199+
*/
200+
var minMaxSubarraySum = function (nums, k) {
201+
const computeSum = (nums, k, isMin) => {
202+
const n = nums.length;
203+
const prev = Array(n).fill(-1);
204+
const next = Array(n).fill(n);
205+
let stk = [];
206+
207+
if (isMin) {
208+
for (let i = 0; i < n; i++) {
209+
while (stk.length > 0 && nums[stk[stk.length - 1]] >= nums[i]) {
210+
stk.pop();
211+
}
212+
prev[i] = stk.length > 0 ? stk[stk.length - 1] : -1;
213+
stk.push(i);
214+
}
215+
stk = [];
216+
for (let i = n - 1; i >= 0; i--) {
217+
while (stk.length > 0 && nums[stk[stk.length - 1]] > nums[i]) {
218+
stk.pop();
219+
}
220+
next[i] = stk.length > 0 ? stk[stk.length - 1] : n;
221+
stk.push(i);
222+
}
223+
} else {
224+
for (let i = 0; i < n; i++) {
225+
while (stk.length > 0 && nums[stk[stk.length - 1]] <= nums[i]) {
226+
stk.pop();
227+
}
228+
prev[i] = stk.length > 0 ? stk[stk.length - 1] : -1;
229+
stk.push(i);
230+
}
231+
stk = [];
232+
for (let i = n - 1; i >= 0; i--) {
233+
while (stk.length > 0 && nums[stk[stk.length - 1]] < nums[i]) {
234+
stk.pop();
235+
}
236+
next[i] = stk.length > 0 ? stk[stk.length - 1] : n;
237+
stk.push(i);
238+
}
239+
}
240+
241+
let totalSum = 0;
242+
for (let i = 0; i < n; i++) {
243+
const left = prev[i];
244+
const right = next[i];
245+
const a = left + 1;
246+
const b = i;
247+
const c = i;
248+
const d = right - 1;
249+
250+
let start1 = Math.max(a, i - k + 1);
251+
let endCandidate1 = d - k + 1;
252+
let upper1 = Math.min(b, endCandidate1);
253+
254+
let sum1 = 0;
255+
if (upper1 >= start1) {
256+
const termCount = upper1 - start1 + 1;
257+
const first = start1;
258+
const last = upper1;
259+
const indexSum = (last * (last + 1)) / 2 - ((first - 1) * first) / 2;
260+
const constantSum = (k - i) * termCount;
261+
sum1 = indexSum + constantSum;
262+
}
263+
264+
let start2 = upper1 + 1;
265+
let end2 = b;
266+
start2 = Math.max(start2, a);
267+
end2 = Math.min(end2, b);
268+
269+
let sum2 = 0;
270+
if (start2 <= end2) {
271+
const count = end2 - start2 + 1;
272+
const term = d - i + 1;
273+
sum2 = term * count;
274+
}
275+
276+
totalSum += nums[i] * (sum1 + sum2);
277+
}
278+
279+
return totalSum;
280+
};
281+
282+
const minSum = computeSum(nums, k, true);
283+
const maxSum = computeSum(nums, k, false);
284+
return minSum + maxSum;
285+
};
286+
```
287+
192288
<!-- tabs:end -->
193289

194290
<!-- solution:end -->
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
/**
2+
* @param {number[]} nums
3+
* @param {number} k
4+
* @return {number}
5+
*/
6+
var minMaxSubarraySum = function (nums, k) {
7+
const computeSum = (nums, k, isMin) => {
8+
const n = nums.length;
9+
const prev = Array(n).fill(-1);
10+
const next = Array(n).fill(n);
11+
let stk = [];
12+
13+
if (isMin) {
14+
for (let i = 0; i < n; i++) {
15+
while (stk.length > 0 && nums[stk[stk.length - 1]] >= nums[i]) {
16+
stk.pop();
17+
}
18+
prev[i] = stk.length > 0 ? stk[stk.length - 1] : -1;
19+
stk.push(i);
20+
}
21+
stk = [];
22+
for (let i = n - 1; i >= 0; i--) {
23+
while (stk.length > 0 && nums[stk[stk.length - 1]] > nums[i]) {
24+
stk.pop();
25+
}
26+
next[i] = stk.length > 0 ? stk[stk.length - 1] : n;
27+
stk.push(i);
28+
}
29+
} else {
30+
for (let i = 0; i < n; i++) {
31+
while (stk.length > 0 && nums[stk[stk.length - 1]] <= nums[i]) {
32+
stk.pop();
33+
}
34+
prev[i] = stk.length > 0 ? stk[stk.length - 1] : -1;
35+
stk.push(i);
36+
}
37+
stk = [];
38+
for (let i = n - 1; i >= 0; i--) {
39+
while (stk.length > 0 && nums[stk[stk.length - 1]] < nums[i]) {
40+
stk.pop();
41+
}
42+
next[i] = stk.length > 0 ? stk[stk.length - 1] : n;
43+
stk.push(i);
44+
}
45+
}
46+
47+
let totalSum = 0;
48+
for (let i = 0; i < n; i++) {
49+
const left = prev[i];
50+
const right = next[i];
51+
const a = left + 1;
52+
const b = i;
53+
const c = i;
54+
const d = right - 1;
55+
56+
let start1 = Math.max(a, i - k + 1);
57+
let endCandidate1 = d - k + 1;
58+
let upper1 = Math.min(b, endCandidate1);
59+
60+
let sum1 = 0;
61+
if (upper1 >= start1) {
62+
const termCount = upper1 - start1 + 1;
63+
const first = start1;
64+
const last = upper1;
65+
const indexSum = (last * (last + 1)) / 2 - ((first - 1) * first) / 2;
66+
const constantSum = (k - i) * termCount;
67+
sum1 = indexSum + constantSum;
68+
}
69+
70+
let start2 = upper1 + 1;
71+
let end2 = b;
72+
start2 = Math.max(start2, a);
73+
end2 = Math.min(end2, b);
74+
75+
let sum2 = 0;
76+
if (start2 <= end2) {
77+
const count = end2 - start2 + 1;
78+
const term = d - i + 1;
79+
sum2 = term * count;
80+
}
81+
82+
totalSum += nums[i] * (sum1 + sum2);
83+
}
84+
85+
return totalSum;
86+
};
87+
88+
const minSum = computeSum(nums, k, true);
89+
const maxSum = computeSum(nums, k, false);
90+
return minSum + maxSum;
91+
};

0 commit comments

Comments
 (0)