Skip to content

Commit ae6b9e3

Browse files
committed
feat: problems of next week
1 parent f1f6cf8 commit ae6b9e3

6 files changed

+137
-0
lines changed
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/**
2+
* @param {number[]} nums
3+
* @param {number} k
4+
* @return {number}
5+
*/
6+
const constrainedSubsetSum = function (nums, k) {
7+
const n = nums.length
8+
const q = [[-1e10, -1]]; const dp = Array(n + 1).fill(0); let ans = -1e10
9+
for (let i = 0; i < n; i++) {
10+
// 区间长度超过 k,去掉
11+
while (q.length && i - q[0][1] > k) q.shift()
12+
13+
dp[i] = Math.max(0, q[0][0]) + nums[i]
14+
ans = Math.max(ans, dp[i])
15+
16+
// 远的,还小就要去掉
17+
while (q.length && q[q.length - 1][0] <= dp[i]) q.pop()
18+
q.push([dp[i], i])
19+
}
20+
return ans
21+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/**
2+
* @param {number[]} nums
3+
* @param {number} limit
4+
* @return {number}
5+
*/
6+
const longestSubarray = function (nums, limit) {
7+
const n = nums.length; let ans = 0; const qMin = [[1e10, -1]]; const qMax = [[-1e10, -1]]
8+
for (let i = 0, j = 0; i < n; i++) {
9+
while ((qMin[0][0] === 1e10 || qMax[0][0] === -1e10 || Math.abs(qMax[0][0] - qMin[0][0]) <= limit)) {
10+
ans = Math.max(ans, j - i)
11+
if (j === n) break
12+
while (qMax.length && qMax[qMax.length - 1][0] <= nums[j]) qMax.pop()
13+
while (qMin.length && qMin[qMin.length - 1][0] >= nums[j]) qMin.pop()
14+
qMax.push([nums[j], j])
15+
qMin.push([nums[j], j])
16+
j++
17+
}
18+
19+
while (qMin.length && qMin[0][1] <= i) qMin.shift()
20+
while (qMin.length && qMax[0][1] <= i) qMax.shift()
21+
}
22+
return ans
23+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/**
2+
* @param {number[][]} points
3+
* @param {number} k
4+
* @return {number}
5+
*/
6+
const findMaxValueOfEquation = function (points, k) {
7+
const n = points.length
8+
const q = []; let ans = -1e10
9+
// xj-xi+yi+yj
10+
for (let i = 0, j = 0; i < n; i++) {
11+
while (j < n && points[j][0] - points[i][0] <= k) {
12+
while (q.length && q[q.length - 1][0] <= points[j][0] + points[j][1]) q.pop()
13+
q.push([points[j][0] + points[j][1], j])
14+
j++
15+
}
16+
while (q.length && q[0][1] <= i) q.shift()
17+
18+
if (q.length) { ans = Math.max(ans, q[0][0] - points[i][0] + points[i][1]) }
19+
}
20+
return ans
21+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/**
2+
* @param {number[]} arr
3+
* @param {number} m
4+
* @return {number}
5+
*/
6+
const findLatestStep = function (arr, m) {
7+
const day = []; const n = arr.length; const q = []
8+
let ans = -1
9+
for (let i = 0; i < arr.length; i++) {
10+
day[arr[i]] = i + 1
11+
}
12+
// 区间 [i-m+1, i] 被设置为 1,求区间中所有 1 的最大 day 值
13+
for (let i = 1; i <= n; i++) {
14+
while (q.length && i - q[0][1] >= m) q.shift()
15+
while (q.length && q[q.length - 1][0] <= day[i]) q.pop()
16+
q.push([day[i], i])
17+
18+
if (i < m) continue
19+
const maxDay = q[0][0]
20+
const left = day[i - m] ?? 1e10; const right = day[i + 1] ?? 1e10
21+
if (left > maxDay && right > maxDay) {
22+
ans = Math.max(ans, Math.min(left, right, n + 1) - 1)
23+
}
24+
}
25+
return ans
26+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
/**
2+
* @param {number[]} nums
3+
* @param {number} k
4+
* @return {number[]}
5+
*/
6+
const maxSlidingWindow = function (nums, k) {
7+
const q = []; const ans = []
8+
for (let i = 0; i < nums.length; i++) {
9+
// 越远,又越小的数不需要保留
10+
while (q.length && q[q.length - 1][0] < nums[i]) q.pop()
11+
q.push([nums[i], i])
12+
// 长度不能超过 k
13+
while (q.length && i - q[0][1] >= k) q.shift()
14+
if (i >= k - 1) ans.push(q[0][0])
15+
}
16+
return ans
17+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/**
2+
* @param {string} s
3+
* @return {number}
4+
*/
5+
const numPermsDISequence = function (s) {
6+
const n = s.length; const P = 1e9 + 7
7+
s = '#' + s
8+
const dp = Array(n + 1).fill(0).map(() => Array(n + 1).fill(0))
9+
dp[0][0] = 1
10+
// dp[i][j] 表示 0~i 的满足题目条件的排列组合,且最后一位为 j 的方案数目
11+
for (let i = 1; i <= n; i++) {
12+
for (let j = 0; j <= i; j++) {
13+
if (s[i] === 'I') {
14+
for (let k = 0; k < j; k++) {
15+
dp[i][j] += dp[i - 1][k]
16+
dp[i][j] %= P
17+
}
18+
} else {
19+
for (let k = j; k <= i - 1; k++) {
20+
dp[i][j] += dp[i - 1][k]
21+
dp[i][j] %= P
22+
}
23+
}
24+
}
25+
}
26+
let ans = 0
27+
for (let i = 0; i <= n; i++) ans = (ans + dp[n][i]) % P
28+
return ans
29+
}

0 commit comments

Comments
 (0)