Leetcode周赛325解析

201 阅读1分钟

不积跬步,无以至千里;不积小流,无以成江海

📅:2022-12-25 10:3 01 小时 30 分

🔗:leetcode.cn/contest/wee…

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 = [000];
    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 排版