Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 2e5b60f

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

File tree

3 files changed

+283
-0
lines changed

3 files changed

+283
-0
lines changed

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

Lines changed: 96 additions & 0 deletions
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 -->

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

Lines changed: 96 additions & 0 deletions
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 -->
Lines changed: 91 additions & 0 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /