第 119 场 LeetCode 双周赛题解

A 找到两个数组中的公共元素

模拟

cpp 复制代码
class Solution {
public:
    vector<int> findIntersectionValues(vector<int> &nums1, vector<int> &nums2) {
        unordered_set<int> s1(nums1.begin(), nums1.end()), s2(nums2.begin(), nums2.end());
        vector<int> res(2);
        for (auto x: nums1)
            if (s2.count(x))
                res[0]++;
        for (auto x: nums2)
            if (s1.count(x))
                res[1]++;
        return res;
    }
};

B 消除相邻近似相等字符

动态规划:设 p [ i ] [ j ] p[i][j] p[i][j] 为将 w o r d [ 0 , i ] word[0,i] word[0,i] 修改为末位为 j j j 的不含相邻近似相等字符串的最少操作数,枚举可能的 w o r d [ i − 1 ] word[i-1] word[i−1] 进行状态转移

cpp 复制代码
class Solution {
public:
    int removeAlmostEqualCharacters(string word) {
        int n = word.size();
        int p[n][26];
        for (int j = 0; j < 26; j++)
            p[0][j] = 1;
        p[0][word[0] - 'a'] = 0;
        for (int i = 1; i < n; i++)
            for (int j = 0; j < 26; j++) {
                p[i][j] = INT32_MAX;
                for (int pre = 0; pre < 26; pre++)
                    if (abs(j - pre) > 1)
                        p[i][j] = min(p[i][j], p[i - 1][pre] + (word[i] - 'a' == j ? 0 : 1));
            }
        int res = INT32_MAX;
        for (int j = 0; j < 26; j++)
            res = min(res, p[n - 1][j]);
        return res;
    }
};

C 最多 K 个重复元素的最长子数组

滑动窗口+哈希:哈希表记录滑动窗口内数的频率,枚举滑动窗口的左边界,尽可能移动滑动窗口的右边界

cpp 复制代码
class Solution {
public:
    int maxSubarrayLength(vector<int> &nums, int k) {
        int n = nums.size();
        int res = 0;
        unordered_map<int, int> f;
        for (int l = 0, r = -1; l < n; f[nums[l++]]--) {
            while (r + 1 < n && f[nums[r + 1]] + 1 <= k)//滑窗左边界固定时,尽可能移动右边界
                f[nums[++r]]++;
            res = max(res, r - l + 1);
        }
        return res;
    }
};

D 关闭分部的可行集合数目



枚举:枚举可能的关闭分部集合,然后在当前关闭情况下跑多源最短路算法,然后判断最大的最短路是否不超过 m a x D i s t a n c e maxDistance maxDistance

cpp 复制代码
class Solution {
public:
    inline int get_bit(int mask, int loc) { return mask >> loc & 1; }//返回mask二进制表示的第loc位

    int pop_cnt(int mask) {//返回mask二进制表示中1的个数
        int res = 0;
        for (; mask; mask >>= 1)
            if (mask & 1)
                res++;
        return res;
    }

    int numberOfSets(int n, int maxDistance, vector<vector<int>> &roads) {
        int inf = INT32_MAX;
        vector<vector<int>> g(n, vector<int>(n, inf));
        for (auto &e: roads) {
            g[e[0]][e[1]] = min(g[e[0]][e[1]], e[2]);
            g[e[1]][e[0]] = g[e[0]][e[1]];
        }
        int res = 0;
        for (int mask = 0; mask < (1 << n); mask++) {//枚举关闭分部集合:mask二进制中第i位为0表示第i个分部关闭
            auto t = g;
            for (int k = 0; k < n; k++)
                if (get_bit(mask, k))
                    for (int i = 0; i < n; i++)
                        if (get_bit(mask, i))
                            for (int j = 0; j < n; j++)
                                if (get_bit(mask, j))
                                    if (t[i][k] != inf && t[k][j] != inf)
                                        t[i][j] = min(t[i][j], t[i][k] + t[k][j]);
            int mx = 0;//最大的最短路
            for (int i = 0; i < n; i++)
                if (get_bit(mask, i))
                    for (int j = 0; j < n; j++)
                        if (j != i && get_bit(mask, j))
                            mx = max(mx, t[i][j]);
            if (mx <= maxDistance)
                res++;
        }
        return res;
    }
};
相关推荐
Coovally AI模型快速验证32 分钟前
MMYOLO:打破单一模式限制,多模态目标检测的革命性突破!
人工智能·算法·yolo·目标检测·机器学习·计算机视觉·目标跟踪
可为测控1 小时前
图像处理基础(4):高斯滤波器详解
人工智能·算法·计算机视觉
Milk夜雨2 小时前
头歌实训作业 算法设计与分析-贪心算法(第3关:活动安排问题)
算法·贪心算法
BoBoo文睡不醒2 小时前
动态规划(DP)(细致讲解+例题分析)
算法·动态规划
apz_end2 小时前
埃氏算法C++实现: 快速输出质数( 素数 )
开发语言·c++·算法·埃氏算法
仟濹3 小时前
【贪心算法】洛谷P1106 - 删数问题
c语言·c++·算法·贪心算法
银河梦想家4 小时前
【Day23 LeetCode】贪心算法题
leetcode·贪心算法
CM莫问4 小时前
python实战(十五)——中文手写体数字图像CNN分类
人工智能·python·深度学习·算法·cnn·图像分类·手写体识别
sz66cm4 小时前
LeetCode刷题 -- 45.跳跃游戏 II
算法·leetcode
Amor风信子4 小时前
华为OD机试真题---战场索敌
java·开发语言·算法·华为od·华为