不积跬步,无以至千里;不积小流,无以成江海
📅:2022-12-25 10:3 01 小时 30 分
A: 2515. 到目标字符串的最短距离
思路:模拟
关键点:
JavaScript实现
var closetTarget = function(words, target, startIndex) {
const n = words.length;
let ans = n;
for (let i = 0; i < n; i++) {
if (words[i] === target) {
ans = Math.min(ans, Math.abs(i - startIndex), n - Math.abs(i - startIndex));
}
}
return ans == n ? -1 : ans;
};
B: 2516. 每种字符至少取 K 个
思路:双指针
关键点:
JavaScript实现
var takeCharacters = function(s, k) {
const n = s.length;
let j = n;
let cnt = [0, 0, 0];
while (cnt[0] < k || cnt[1] < k || cnt[2] < k) {
if (j == 0) return -1;
j -= 1;
cnt[s.charCodeAt(j) - 'a'.charCodeAt(0)] += 1;
}
let ans = n - j;
for (let i = 0; i < n; i++) {
let left = s.charCodeAt(i) - 'a'.charCodeAt(0);
let right = s.charCodeAt(j) - 'a'.charCodeAt(0);
cnt[left] += 1;
while (j < n && cnt[right] > k) {
cnt[right] -= 1;
j += 1;
right = s.charCodeAt(j) - 'a'.charCodeAt(0);
}
ans = Math.min(ans, i + 1 + n - j);
if (j == n) break;
}
return ans;
};
C: 2517. 礼盒的最大甜蜜度
思路:二分
关键点:
JavaScript实现
var maximumTastiness = function(price, k) {
const n = price.length;
price.sort((a, b) => a - b);
const check = function (d) {
let cnt = 1;
let x0 = price[0];
for (let x of price) {
if (x >= x0 + d) {
cnt += 1;
x0 = x;
}
}
return cnt >= k;
}
let left = 0;
let right = price[n - 1];
while (left + 1 < right) {
let mid = (left + right) >> 1;
// console.log(mid)
if (check(mid)) {
left = mid;
} else {
right = mid;
}
}
return left;
};
D: 2518. 好分区的数目
思路:01背包 + 状态压缩
关键点:
JavaScript实现
var countPartitions = function(nums, k) {
const sum = nums.reduce((a, c) => a + c, 0);
if (sum < k * 2) return 0;
const mod = 10 ** 9 + 7;
let dp = new Array(k).fill(0);
dp[0] = 1;
let ans = 1
for (let cur of nums) {
ans = ans * 2 % mod;
for (let j = k - 1; j >= cur; j--) {
dp[j] = (dp[j] + dp[j - cur]) % mod;
}
}
ans += mod;
ans -= dp.reduce((a, c) => (a + c) % mod, 0) * 2;
ans %= mod;
return ans;
};
🛵复盘
| 序号 | 是否通过 | 说明 | 待加强 |
|---|---|---|---|
| A: | ✅ | ||
| B: | ❌ | 未能确定双指针的移动条件 | |
| C: | ❌ | ||
| D: | ❌ | 494. 目标和 |
本文使用 markdown.com.cn 排版