Skip to content

Commit bc23fa6

Browse files
authored
Create Solution.js
1 parent d7dfeb5 commit bc23fa6

File tree

1 file changed

+90
-0
lines changed
  • solution/3400-3499/3430.Maximum and Minimum Sums of at Most Size K Subarrays

1 file changed

+90
-0
lines changed
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
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 = new Array(n).fill(-1);
10+
const next = new Array(n).fill(n);
11+
let stack = [];
12+
13+
if (isMin) {
14+
for (let i = 0; i < n; i++) {
15+
while (stack.length > 0 && nums[stack[stack.length - 1]] >= nums[i]) {
16+
stack.pop();
17+
}
18+
prev[i] = stack.length > 0 ? stack[stack.length - 1] : -1;
19+
stack.push(i);
20+
}
21+
stack = [];
22+
for (let i = n - 1; i >= 0; i--) {
23+
while (stack.length > 0 && nums[stack[stack.length - 1]] > nums[i]) {
24+
stack.pop();
25+
}
26+
next[i] = stack.length > 0 ? stack[stack.length - 1] : n;
27+
stack.push(i);
28+
}
29+
} else {
30+
for (let i = 0; i < n; i++) {
31+
while (stack.length > 0 && nums[stack[stack.length - 1]] <= nums[i]) {
32+
stack.pop();
33+
}
34+
prev[i] = stack.length > 0 ? stack[stack.length - 1] : -1;
35+
stack.push(i);
36+
}
37+
stack = [];
38+
for (let i = n - 1; i >= 0; i--) {
39+
while (stack.length > 0 && nums[stack[stack.length - 1]] < nums[i]) {
40+
stack.pop();
41+
}
42+
next[i] = stack.length > 0 ? stack[stack.length - 1] : n;
43+
stack.push(i);
44+
}
45+
}
46+
47+
let sum = 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 s_start = Math.max(a, i - k + 1);
57+
let s_end_candidate = d - k + 1;
58+
let s_upper = Math.min(b, s_end_candidate);
59+
60+
let sum1 = 0;
61+
if (s_upper >= s_start) {
62+
const num_terms = s_upper - s_start + 1;
63+
const first = s_start;
64+
const last = s_upper;
65+
const sum_s = (last * (last + 1)) / 2 - ((first - 1) * first) / 2;
66+
const sum_k = (k - i) * num_terms;
67+
sum1 = sum_s + sum_k;
68+
}
69+
70+
let s2_start = s_upper + 1;
71+
let s2_end = b;
72+
s2_start = Math.max(s2_start, a);
73+
s2_end = Math.min(s2_end, b);
74+
75+
let sum2 = 0;
76+
if (s2_start <= s2_end) {
77+
const count = s2_end - s2_start + 1;
78+
const term = d - i + 1;
79+
sum2 = term * count;
80+
}
81+
82+
sum += nums[i] * (sum1 + sum2);
83+
}
84+
return sum;
85+
};
86+
87+
const sumMin = computeSum(nums, k, true);
88+
const sumMax = computeSum(nums, k, false);
89+
return sumMin + sumMax;
90+
};

0 commit comments

Comments
 (0)