LeetCode --- 132双周赛

news2025/2/25 21:04:48

题目列表

3174. 清除数字

3175. 找到连续赢 K 场比赛的第一位玩家

3176. 求出最长好子序列 I

3177. 求出最长好子序列 II

一、清理数字

这题直接根据题目,进行模拟即可,大体的思路是遍历字符串,遇到字母就加入答案,遇到数字就去掉答案中的最后一个字母,最后返回答案(类似进栈出栈),代码如下

class Solution {
public:
    string clearDigits(string s) {
        string ans;
        for(auto e:s){
            if(isdigit(e))  ans.pop_back();
            else ans += e;
        }
        return ans;
    }
};

二、找到连续赢k场的比赛的第一个玩家

这题的关键在于赢了的玩家会留下来和其他的玩家进行比赛,这就意味了在他之前参加比赛的人的skill都要小于他

  • 如果n个人比完了,其中没有人赢下k场比赛,那么第一个赢下k场比赛的玩家必然是skill最大的那个
  • 我们还要考虑在skill最大的玩家还没出现之前,就已经有玩家赢得k场比赛的情况

具体代码如下

class Solution {
public:
    int findWinningPlayer(vector<int>& skills, int k) {
        int n = skills.size();
        int pos = 0, cnt = 0;
        for(int i = 1; i < n; i++){
            if(skills[pos] < skills[i])
                pos = i, cnt = 0;
            cnt++;
            if(cnt == k) return pos;
        }
        return pos;
    }
};

三、求出最长好子序列 I & II

题目要求好子序列的最长长度,是一个子序列相关的动态规划问题。

状态定义:

子序列dp问题一般有两种类型,相邻相关 和 相邻无关 (看子序列的相邻元素之间是否存在某种关系/限制),分别对应两种状态的定义套路:相邻相关:以i为结尾的子序列的______,相邻无关:前i个元素中______。

本题显然是相邻相关的子序列问题,状态定义为 dp[i][j] 表示以i为结尾的子序列中最多有j个满足相邻元素不相等的最长子序列长度

状态转移方程:

  • 当nums[i] == nums[k]时,dp[i][j] = max(dp[i][j], dp[k][j] + 1)
  • 当nums[i] != nums[k]时,dp[i][j] = max(dp[i][j], dp[k][j-1] + 1)
  • 其中 k < i

初始化:考虑 j = 0 的情况,即最多有0个相邻元素相等的情况(等价于子序列中的元素全部相同),边遍历数组便统计数组出现次数即可。

代码如下

class Solution {
public:
    int maximumLength(vector<int>& nums, int k) {
        int n = nums.size();
        unordered_map<int,int> mp; // 记录相同元素的个数
        int ans = 0;
        vector<vector<int>> dp(n, vector<int>(k + 1));
        // 初始化
        for(int i = 0; i < n;i ++){
            dp[i][0] = ++mp[nums[i]];
            ans = max(ans, dp[i][0]);
        }
        for(int j = 1; j <= k; j++){
            dp[0][j] = dp[0][0];
        }
        for(int i = 1; i < n; i++){ // 枚举以哪个数字为结尾
            for(int j = 1; j <= k; j++){ // 枚举最多有j个相邻不相同的情况
                for(int p = 0; p < i; p ++){ // 从之前的状态进行转移
                    if(nums[i] == nums[p]) dp[i][j] = max(dp[i][j], dp[p][j] + 1);
                    else dp[i][j] = max(dp[i][j], dp[p][j-1] + 1);
                }
            }
            ans = max(ans, dp[i][k]); // 注意答案是所有以i为结尾的子序列最大长度的最大值
        }
        return ans;
    }
};

时间复杂度为O(kn^2),显然是过不了的第四问的,如何优化时间复杂度???我们需要将第三层for循环求max的时间缩短为O(1),如何做?

这里有一个技巧,我们可以将下标换成值,在去思考如何优化,即将状态定义改为 dp[x][j] 表示以x=nums[i]为结尾的最多有j个相邻不相同元素的子序列最大长度

转移方程:

  • 当 x == nums[k] 时,dp[x][j] = max(dp[x][j], dp[x][j] + 1) = dp[x][j]+1
  • 当 x != y 时,dp[x][j] = max(dp[x][j], dp[y][j-1] + 1)
  • 其中 k < i

故 dp[x][j] = max(dp[x][j],dp[y][j-1]) + 1,其中y是不等于x的出现过的数,所以我们只要维护好dp[y][j-1]的最大值就能在O(1)的时间复杂度内求出答案,即我们只要维护好前一列的最大值即可,即维护一个数组mx[j] = max(dp[y][j-1]),这里我们不需要额外关心 y == x的情况,因为dp[x][j] >= dp[x][j-1],所以不会对答案产生影响

代码如下

class Solution {
public:
    int maximumLength(vector<int>& nums, int k) {
        unordered_map<int,vector<int>> dp;
        vector<int> mx(k+2);
        for(int x:nums){
            if(!dp.contains(x)) dp[x].resize(k+1);
            auto& f = dp[x];
            for(int j = k; j >= 0; j--){ // 这里得是从后往前遍历,正着遍历会覆盖掉之前的mx[j]
                f[j] = max(f[j], mx[j]) + 1;
                mx[j+1] = max(mx[j+1], f[j]);
            }
        }
        return mx[k+1];
    }
};

总结:上面两种状态定义的大致思路是一样的,只是从下标改为了数值,转移方程也很相似,但是在维护max时,因为状态的转移和数值有关,我们需要在下标和数值之间建立联系,但问题是这种联系不是一一对应的,导致我们很难通过数值关系找到合适的下标来进行操作,但是我们只要将状态的定义和数值直接挂钩,我们就能很轻松的发现维护max的方法。

这里大家可以记住这样的一个技巧:当我们需要对dp进行优化时,且状态的转移和数值有关,我们可以优先考虑是否能将状态参数改为数值

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1823885.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

android studio 自定义类注释模版

perferences>File and Code Templates>Class 填写&#xff1a; /*** ClassName: ${ClassName}* Description: ${Description}* Author: ${Author}* CreateDate: ${CreateDate}* UpdateUser: ${UpdateUser}* UpdateDate: ${UpdateDate}* UpdateRemark: ${UpdateRemark}* …

Spring boot 启动报:Do not use @ for indentation

一、使用maven插件动态切换配置时出现报错 二、配置文件及pom 2.1 配置文件结构 2.2 application.yml spring: # 根据环境读取配置文件&#xff08;手动&#xff09; # profiles: # active: dev# 根据环境读取配置文件&#xff08;通过勾选maven插件&#xff09;profiles…

Python时间序列分析库

Sktime Welcome to sktime — sktime documentation 用于ML/AI和时间序列的统一API,用于模型构建、拟合、应用和验证支持各种学习任务,包括预测、时间序列分类、回归、聚类。复合模型构建,包括具有转换、集成、调整和精简功能的管道scikit学习式界面约定的交互式用户体验Pro…

如何应对生活中的不确定性:仁者安仁,知者利仁。

有较高自尊水平的人&#xff0c;接近于孔子说的&#xff1a;仁者。 ——— 有着稳定的高自尊&#xff0c;无论外在环境如何变化&#xff0c;对其影响都不大&#xff0c;他能够愉快地生活。 相反&#xff1a;一个人处于低自尊状态&#xff0c;就会活得很痛苦&#xff0c;对自己…

俄罗斯Yandex推广投放如何开户?Yandex广告开户和代运营推广流程详解_俄罗斯_受众_搜索引擎

在俄罗斯进行Yandex广告推广是一种有效的在线营销方式&#xff0c;特别是针对俄罗斯市场。Yandex是俄罗斯最受欢迎的搜索引擎&#xff0c;类似于Google在全球范围内的地位。以下是通过Yandex广告推广的一般步骤&#xff0c;以及如何通过上海上弦进行广告开户和代运营。 1. Yan…

Stringboot

一、概述 springboot是spring家族中的一个全新框架&#xff0c;用来简化spring程序的创建和开发过程。在以往我们通过SpringMVCSpringMybatis框架进行开发的时候&#xff0c;我们需要配置web.xml&#xff0c;spring配置&#xff0c;mybatis配置&#xff0c;然后整合在一起&…

明天二战六级

明天二战六级&#xff0c;各位程序员们&#xff0c;加油

活动集锦 | 英码科技积极参与行业盛会,AI赋能城市数字化转型

在当今数字经济时代&#xff0c;城市全域数字化转型已经成为提升城市管理效能、优化资源配置、推动经济发展的重要手段。英码科技始终致力于为企业打造高效、低成本的行业应用方案&#xff0c;助力企业实现数字化转型。近日&#xff0c;英码科技受邀参加了多场行业展示活动&…

[Java基本语法] 继承与多态

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏:&#x1f355; Collection与数据结构 (92平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 &#x1f9c0;线程与…

zabbix老版本3.0.14迁移

由于之前zabbix版本过老&#xff0c;一直未能升级&#xff0c;现在一台老的服务器需要迁移&#xff0c;服务器较老&#xff0c;就不更新&#xff0c;先迁移数据&#xff0c; 下载地址&#xff1a; Zabbix Official Repository http://repo.zabbix.com/zabbix/3.0/rhel/7/x86…

R 文件优化插件:Binary XML file in layout Error inflating class

场景一&#xff1a;构造函数缺失 问题 自定义布局&#xff08;FlagmentLayout&#xff09;加载自定义属性失败&#xff0c;导致广告显示异常&#xff0c;甚至是闪退&#xff5e; InflateException 在 Android 中我们遇到的通常发生在自定义 View 创建中&#xff0c;动态加载…

【安装笔记-20240614-Linux-在 OpenWrt 上安装 filebrowser 支持文件分享】

安装笔记-系列文章目录 安装笔记-20240614-Linux-在 OpenWrt 上安装 filebrowser 支持文件分享 文章目录 安装笔记-系列文章目录安装笔记-20240614-Linux-在 OpenWrt 上安装 filebrowser 支持文件分享 前言一、软件介绍名称&#xff1a;filebrowser主页官方介绍特点 二、安装步…

Ubuntu如何添加用户环境变量

一&#xff0c;简介 在工作中&#xff0c;需要将某个环境变量添加到用户环境变量中&#xff0c;方便使用。 要将 SOF_WORKSPACE~/work/sof 添加到用户的环境变量中&#xff0c;需要将该设置添加到用户的 shell 配置文件中&#xff0c;例如 ~/.bashrc&#xff08;对于 Bash 用…

vue 渲染函数 h jsx

h 是什么 vue 提供的创建虚拟 DOM 节点 (vnode)的函数。 https://cn.vuejs.org/api/render-function.html#h jsx 是什么 JSX是 JavaScript XML&#xff08;HTML&#xff09;的缩写&#xff0c;表示在 JS 代码中书写 HTML 结构。简单理解就是&#xff1a; JSXjavascript xml&am…

线代知识点总结

目录 一.初等行/列变换 1.计算行列式时&#xff0c;行列变换都可 2.求矩阵的秩时&#xff0c;行列变换都可 3.解线性方程组时&#xff0c;仅能使用初等行变换 4.判定解的情况&#xff0c;单纯求r(A),r(A,b)的过程行列变换都可 5.求向量组极大无关组、线性表出关系&#x…

神经网络学习1—nn.Module

nn.module 为所有神经网络提供了一个模板 import torch.nn as nn import torch.nn.functional as Fclass Model(nn.Module):def __init__(self):super(Model, self).__init__()self.conv1 nn.Conv2d(1, 20, 5)self.conv2 nn.Conv2d(20, 20, 5)def forward(self, x):x F.rel…

淘宝评论电商API接口,解读商品评论

随着互联网的不断发展&#xff0c;电子商务在我国得到了迅速普及&#xff0c;淘宝网作为我国最大的网上购物平台&#xff0c;每天都有数以亿计的消费者在此进行购物。而消费者在购物时&#xff0c;最关心的问题之一就是商品的真实评价。为了解决这一问题&#xff0c;淘宝网推出…

10.错误处理

标题 一、概述二、panic!与不可恢复错误2.1 出错时2.2 示例2.3 panic!的 backtrace 三、Result 与可恢复的错误3.1 引入3.2 错误示例3.3 传播错误1&#xff09;概念2&#xff09;传播错误示例3&#xff09;传播错误的简写&#xff1a;&#xff1f;运算符 一、概述 Rust将错误分…

Matlab的Simulink系统仿真(simulink调用m函数)

这几天要用Simulink做一个小东西&#xff0c;所以在网上现学现卖&#xff0c;加油&#xff01; 起初的入门是看这篇文章MATLAB 之 Simulink 操作基础和系统仿真模型的建立_matlab仿真模型搭建-CSDN博客 写的很不错 后面我想在simulink中调用m文件 在 Simulink 中调用 MATLA…

PPT: Pre-trained Prompt Tuning for Few-shot Learning

文章汇总 当前的问题 当前的学者(a)、(b)、©都是通过微调模型(encoder/decoder)来适应下游任务。尽管效果很好&#xff0c;但是一方面代价很大&#xff0c;一方面在小样本设置下&#xff0c;微调模型这种做法性能差得多。本文的想法&#xff1a;通过一些预训练任务仅冻结…