第 115 场 LeetCode 双周赛题解

news/2024/5/20 8:59:18 标签: leetcode, 算法, 贪心, 动态规划, 滑动窗口

A leetcode.cn/problems/last-visited-integers">上一个遍历的整数

在这里插入图片描述

模拟

class Solution {
public:
    vector<int> lastVisitedIntegers(vector<string> &words) {
        vector<int> res;
        vector<int> li;
        for (int i = 0, n = words.size(); i < n;) {
            if (words[i] != "prev")
                li.push_back(stoi(words[i++]));
            else {
                int j = i;
                for (; j < n && words[j] == "prev"; j++) {
                    if (li.size() < j - i + 1)
                        res.push_back(-1);
                    else
                        res.push_back(li[li.size() - (j - i + 1)]);
                }
                i = j;
            }
        }
        return res;
    }
};

B leetcode.cn/problems/longest-unequal-adjacent-groups-subsequence-i">最长相邻不相等子序列 I

在这里插入图片描述

贪心:遍历 g r o u p s groups groups ,若当前元素不等于选择的上一个位置的元素,则将当前位置加入选择的位置子序列,最终返回选择的子序列在 w o r d s words words 对应下标的字符串序列

class Solution {
public:
    vector<string> getWordsInLongestSubsequence(int n, vector<string> &words, vector<int> &groups) {
        vector<int> ind;
        for (int i = 0; i < n; i++)
            if (ind.empty() || groups[i] != groups[ind.back()])
                ind.push_back(i);
        vector<string> res;
        for (auto x: ind)
            res.push_back(words[x]);
        return res;
    }
};

C leetcode.cn/problems/longest-unequal-adjacent-groups-subsequence-ii">最长相邻不相等子序列 II

在这里插入图片描述

动态规划:设 p [ i ] p[i] p[i] 为以 i i i 结尾的满足题目所述条件的最长子序列的长度,求出 p p p 数组后,设 p [ i n d ] p[ind] p[ind] 为其最大值,则从 i n d ind ind 开始逆序求子序列中的各个元素。

class Solution {
public:
    int comp_dis(string &a, string &b) {//计算字符串a和b的汉明距离
        if (a.size() != b.size())
            return -1;
        int res = 0;
        for (int i = 0; i < a.size(); i++)
            if (a[i] != b[i])
                res++;
        return res;
    }

    vector<string> getWordsInLongestSubsequence(int n, vector<string> &words, vector<int> &groups) {
        vector<int> p(n);
        int d[n][n];
        for (int i = 0; i < n; i++) {
            p[i] = 1;
            for (int j = 0; j < i; j++) {
                if (groups[j] == groups[i])
                    continue;
                d[i][j] = comp_dis(words[j], words[i]);
                if (d[i][j] == 1)
                    p[i] = max(p[i], p[j] + 1);//子序列中j可能是i的上一个元素
            }
        }
        int ind = 0;
        for (int i = 1; i < n; i++)
            if (p[i] > p[ind])
                ind = i;
        vector<string> res;
        while (1) {//逆序求子序列中的各个元素
            res.push_back(words[ind]);
            if (p[ind] == 1)
                break;
            for (int j = 0; j < ind; j++)
                if (groups[j] != groups[ind] && d[ind][j] == 1 && p[j] + 1 == p[ind]) {//j可以是最长子序列中ind的前一个元素
                    ind = j;
                    break;
                }
        }
        reverse(res.begin(), res.end());
        return res;
    }
};

D leetcode.cn/problems/count-of-sub-multisets-with-bounded-sum">和带限制的子多重集合的数目

在这里插入图片描述

动态规划:设 c n t cnt cnt 表示 n u m s nums nums v i vi vi 出现 c n t [ v i ] cnt[vi] cnt[vi] 次,设 p i , s p_{i,s} pi,s 为由 c n t cnt cnt 中前 i i i 个不同 v i vi vi 构成的和为 s s s 的多重集合的数目,有状态转移方程 p i , s = p i − 1 , s + p i − 1 , s − v i + ⋯ + p i − 1 , s − v i × c n t [ v i ] p_{i,s}=p_{i-1,s}+p_{i-1,s-vi}+\cdots+p_{i-1,s-vi\times cnt[vi]} pi,s=pi1,s+pi1,svi++pi1,svi×cnt[vi] ,类似的有 p i , s − v i = p i − 1 , s − v i + ⋯ + p i − 1 , s − v i × ( c n t [ v i ] + 1 ) p_{i,s-vi}=p_{i-1,s-vi}+\cdots+p_{i-1,s-vi\times (cnt[vi]+1)} pi,svi=pi1,svi++pi1,svi×(cnt[vi]+1),合并一下可以得到 p i , s = p i , s − v i + p i − 1 , s − p i − 1 , s − v i × ( c n t [ v i ] + 1 ) p_{i,s}=p_{i,s-vi}+p_{i-1,s}-p_{i-1,s-vi\times(cnt[vi]+1)} pi,s=pi,svi+pi1,spi1,svi×(cnt[vi]+1),另外数组中的 0 0 0 需要单独处理,及答案为不考虑 0 0 0 时的答案 × ( c n t [ 0 ] + 1 ) \times (cnt[0]+1) ×(cnt[0]+1)

class Solution {
public:
    using ll = long long;
    ll mod = 1e9 + 7;
    map<int, int> cnt;
    int sum_ = 0;
    int c0 = 0;

    int le(int mx) {//和不超过mx的子多重集合的数目
        int n = cnt.size();
        int p[n + 1][mx + 1];
        memset(p, 0, sizeof(p));
        p[0][0] = 1;
        auto it = cnt.begin();
        for (int i = 1; i <= n; i++) {
            int vi = it->first, ci = it->second;
            for (int s = 0; s <= mx; s++) {
                p[i][s] = p[i - 1][s];
                if (s - vi >= 0)
                    p[i][s] = (p[i][s] + p[i][s - vi]) % mod;
                if (s - vi * (ci + 1) >= 0)
                    p[i][s] = (p[i][s] - p[i - 1][s - vi * (ci + 1)]) % mod;
            }
            it++;
        }
        ll res = 0;
        for (int s = 0; s <= mx; s++)
            res = (res + p[n][s]) % mod;
        res = (res * (c0 + 1)) % mod;
        return (res + mod) % mod;
    }

    int countSubMultisets(vector<int> &nums, int l, int r) {
        for (auto x: nums) {
            if (x)
                cnt[x]++;
            else
                c0++;
            sum_ += x;
        }
        int vr = le(r);
        int vl = l != 0 ? le(l - 1) : 0;
        return ((vr - vl) % mod + mod) % mod;
    }
};

http://www.niftyadmin.cn/n/5091251.html

相关文章

CSS小技巧之单标签loader

本文翻译自 How to create a CSS-only loader with one element&#xff0c;作者&#xff1a; Temani Afif&#xff0c; 略有删改。 loader组件是网站的重要组成部分。它可以用在许多地方&#xff0c;我们需要显示的内容正在加载中。这样的组件需要尽可能简单&#xff0c;在这篇…

Java上传文件后没有读取权限

问题描述 上传文件后通过transferTo()将文件存储到目标路径&#xff0c;发现文件的组权限、其他用户权限没有读权限。 [rootlocalhost ~]# ll total 19852 -rw------- 1 root root 345073 Oct 12 14:27 31cca6c2-046e-4552-8f24-21af62c44843.pdf -rw------- 1 root root …

Linux:Mac VMware Fusion13以及CentOS7安装包

Linux&#xff1a;Mac VMware Fusion13以及CentOS7安装包 1. Mac VMware Fusion132. CentOS7安装包3. 安装 1. Mac VMware Fusion13 下载官网地址&#xff1a;https:www.vmware.com/products/fusion/fusion-evaluation.html 2. CentOS7安装包 注意是m芯片需要使用arm架构的i…

多模态模型文本预处理方式

句子级别 句子级别的表征编码一整个句子到一个特征中。如果一个句子有多个短语&#xff0c;提取这些短语丢弃其他的单词。 缺点&#xff1a;这种方式会丢失句子中细粒度的信息。 单词级别 将句子中的类别提取出来&#xff0c;结合成一个句子。 缺点&#xff1a;会在类别之…

源代码漏洞监测【软件代码缺陷性检测】

本文仅供思路参考、交流 一、题目要求 利用树、图、序列等对软件源代码进行代码表征。利用深度学习实现对代码有无漏洞的分类实现检测漏洞类型调研过程 调研了一些论文,发现目前的一些论文,例如FUNDED、SemVulDet、SEVulDet、SySeVR都只能实现二分类,即有无代码漏洞,但是这…

Docker Compose命令讲解+文件编写

docker compose的用处是对 Docker 容器集群的快速编排。&#xff08;源码&#xff09; 一个 Dockerfile 可以定义一个单独的应用容器。但我们经常碰到需要多个容器相互配合来完成某项任务的情况&#xff08;如实现一个 Web 项目&#xff0c;需要服务器、数据库、redis等&#…

运维 | 如何查看端口或程序占用情况 | linux

运维 | 如何查看端口或程序占用情况 | linux 前言 本期主要介绍了 LINUX 中如何查看某个端口或程序的使用情况&#xff0c;希望对大家有所帮助。 快速使用 netstat 命令&#xff08;推荐&#xff09; netstat 命令可以显示网络连接、路由表和网络接口信息等。可以使用 net…

Map中的那些事

Map中的那些事 Map中的那些事拓展时间复杂度O(1):常数级O(logn):对数级O(n):线性级O(nlog n):线性对数级O(n):平方级O(n):立方级O(2的n次方):指数级 hashMaphashMap基本知识哈希冲突的定义hashMap的实现原理hashMap有四个构造器 具体问题HashMap的内部数据结构HashMap允许空键空…