Leetcode---111双周赛

题目列表

2824. 统计和小于目标的下标对数目

2825. 循环增长使字符串子序列等于另一个字符串

2826. 将三个组排序

2827. 范围中美丽整数的数目

一、统计和小于目标的下标对数目

 这题直接暴力求解,时间复杂度是O(n^2),代码如下

class Solution {
public:int countPairs(vector<int>& nums, int target) {int n=nums.size(),ans=0;for(int i=0;i<n;i++){for(int j=i+1;j<n;j++){if(nums[i]+nums[j]<target)ans++;}}return ans;}
};

 那么时间复杂度能不能优化呢?

我们再仔细阅读一下题目,就会发现其实i<j这个条件是没必要的因为只要我们找到符合要求的数字对,将它们的下标排个序,就可以算作答案,即数据的顺序可以改变而两数之和相关的题目很容易让我们想到排序+双指针/二分,这里当然是选择双指针,因为更快,总的时间复杂度是O(nlogn+n),代码如下

class Solution {
public:int countPairs(vector<int>& nums, int target) {int n=nums.size(),ans=0;sort(nums.begin(),nums.end());int left=0,right=n-1;while(left<right){int sum=nums[left]+nums[right];if(sum<target){ans+=right-left;left++;}else{right--;}}return ans;}
};

 二、循环增长使字符串子序列等于另一个字符串

 这题关键是把题目意思弄明白,即我们可以选择str1中若干个下标,让这些字符循环递增一次,使得str2成为str1的子序列。代码如下

class Solution {
public:bool canMakeSubsequence(string str1, string str2) {for(int i=0,j=0;i<str1.size();i++){char x=(str1[i]-'a'+1)%26+'a';//得到循环递增之后的字符if(str1[i]==str2[j]||str2[j]==x)j++;if(j==str2.size())return true;}return false;}
};

三、将三个组排序

 这题其实也有点绕,题目说是让你将0~n-1个数分配到三个组中进行排序,本质还是要你通过改变nums数组中的元素,将nums数组中的1,2,3按照非递减顺序排好

我们要找的最小步数其实可以转化成为n - 最长非递减子序列的长度,因为非递减子序列的元素是不用变化的,只要改变不在非递减子序列里的元素即可很显然问题从找最小步数转换成了找最长非递减子序列的长度,代码如下

class Solution {
public://f[i]代表以i为结尾的最长非递减子序列长度//f[i]=max(f[j]+1) (nums[i]>=nums[j])int minimumOperations(vector<int>& nums) {int n=nums.size();int f[n],len=1;for(int i=0;i<n;i++){f[i]=1;for(int j=i-1;j>=0;j--){if(nums[i]>=nums[j]){f[i]=max(f[j]+1,f[i]);}}len=max(len,f[i]);}return n-len;}
};//时间复杂度更优的做法
class Solution {
public:int minimumOperations(vector<int>& nums) {int n=nums.size();vector<int> g;for(auto&x:nums){auto it=upper_bound(g.begin(),g.end(),x);//二分查找,找到大于x的第一个数if(it==g.end())g.push_back(x);else *it=x;}return n-g.size();}
};

但是这个问题的转化不是那么容易想到的,那么还有什么做法?遇到对数组元素进行修改,我们还可以用递归来想一想,为了方便转成递推,我们依旧从后往前思考

1.确定递归的参数和返回值,我们需要后面的元素值来判断该位置的元素是否需要修改,所以需要两个参数,dfs(i,j),i表示当前元素下标,j表示后一个元素值,返回值为前i个元素中的最小步数

2.确定递归的表达式

当nums[i]==j时,dfs(i,j)=dfs(i-1,j)

当nums[i]>j时,dfs(i,j)=dfs(i+1,j)+1

当nums[i]<j时,dfs(i,j)=max(dfs(i-1,nums[i]),dfs(i-1,j)+1)

3.确定递归的边界和入口

边界:当i<0时,返回0,即没有元素需要修改了

入口:dfs(n-1,3)

代码如下

//递归---不记忆化也能过
class Solution {
public:int minimumOperations(vector<int>& nums) {int n=nums.size();function<int(int,int)> dfs=[&](int i,int j){if(i<0)return 0;if(j==nums[i])return dfs(i-1,j);if(j<nums[i])return dfs(i-1,j)+1;elsereturn min(dfs(i-1,j)+1,dfs(i-1,nums[i]));};return dfs(n-1,3);}
};//转成递推
class Solution {
public:int minimumOperations(vector<int>& nums) {int n=nums.size();int f[n+1][4];memset(f,0,sizeof(f));for(int i=0;i<n;i++){for(int j=1;j<=3;j++){if(j==nums[i])f[i+1][j]=f[i][j];else if(j<nums[i]) f[i+1][j]=f[i][j]+1;else f[i+1][j]=min(f[i][j]+1,f[i][nums[i]]);}}return f[n][3];}
};//优化空间
class Solution {
public:int minimumOperations(vector<int>& nums) {int n=nums.size();int f[4];//用几个常量代替也可以,空间复杂度为O(1)memset(f,0,sizeof(f));for(int i=0;i<n;i++){for(int j=1;j<=3;j++){if(j==nums[i])f[j]=f[j];else if(j<nums[i]) f[j]=f[j]+1;else f[j]=min(f[j]+1,f[nums[i]]);}}return f[3];}
};

四、范围中美丽整数的数目

 这题是个很典型的数位dp,主要看你有没有写过这个类型的题目,这种题的套路基本上很固定,就是dfs每一位上填哪个数字,即我们来构造数字,具体细节看代码实现,如下

//dfs
class Solution {
public:int calc(int high,int k){string s=to_string(high);int n=s.size();function<int(int,int,int,bool,bool)>dfs;//这里解释一下函数参数含义//i代表第i位,val代表奇偶数字出现的次数(奇数--val,偶数++val)下面对val的计算可以看看,挺巧妙的,作用一样//mod代表%k之后的数,下面关于mod的计算运用了取模运算符的性质,不清楚的可以去百度一下//islimit代表这个位置之前的数字是否和high的前几位相同,用来判断该位置能取的最大值//isnum代表它前面的位上有没有选数字,即这个数字有没有开始构造dfs=[&](int i,int val,int mod,bool islimit,bool isnum)->int{if(i==n)return isnum&&val==0&&mod==0;//是一个数并且奇偶数目相同并且是k的倍数int res=0;if(!isnum)res=dfs(i+1,val,mod,false,false);int up=islimit?s[i]-'0':9;//看当前位置的值最大为几for(int j=1-isnum;j<=up;j++)res+=dfs(i+1,val+j%2*2-1,(mod*10+j)%k,islimit&&up==j,true);return res;};return dfs(0,0,0,true,false);}int numberOfBeautifulIntegers(int low, int high, int k) {return calc(high,k)-calc(low-1,k);}
};//dfs+记忆化搜索
class Solution {
public:int calc(int high,int k){string s=to_string(high);int n=s.size();int memo[n][2*n+1][k];memset(memo,-1,sizeof(memo));//为了避免mod为负数,就将mod的初始值变成了n,方便记忆化搜索function<int(int,int,int,bool,bool)>dfs;dfs=[&](int i,int val,int mod,bool islimit,bool isnum)->int{if(i==n)return isnum&&val==n&&mod==0;//是一个数并且奇偶数目相同并且是k的倍数if(isnum&&!islimit&&memo[i][val][mod]!=-1)return memo[i][val][mod];int res=0;if(!isnum)res=dfs(i+1,val,mod,false,false);int up=islimit?s[i]-'0':9;//看当前位置的值最大为几for(int j=1-isnum;j<=up;j++)res+=dfs(i+1,val+j%2*2-1,(mod*10+j)%k,islimit&&up==j,true);if(isnum&&!islimit) //只有符合这两个条件的时候,才需要记忆化,因为其他情况只会出现一次,没必要记忆化memo[i][val][mod]=res;return res;};return dfs(0,n,0,true,false);}int numberOfBeautifulIntegers(int low, int high, int k) {return calc(high,k)-calc(low-1,k);}
};

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

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

相关文章

Mysql001:Mysql概述以及安装

前言&#xff1a;本课程将从头学习Mysql&#xff0c;以我的工作经验来说&#xff0c;sql语句真的太重要的&#xff0c;现在互联网所有的一切都是建立在数据上&#xff0c;因为互联网的兴起&#xff0c;现在的数据日月增多&#xff0c;每年都以翻倍的形式增长&#xff0c;对于数…

java八股文面试[多线程]——线程的生命周期

笔试题&#xff1a;画出线程的生命周期&#xff0c;各个状态的转换。 5.等待队列(本是Object里的方法&#xff0c;但影响了线程) 调用obj的wait(), notify()方法前&#xff0c;必须获得obj锁&#xff0c;也就是必须写在synchronized(obj) 代码段内。与等待队列相关的步骤和图 …

Docker容器学习:搭建ownCloud个人网盘

目录 前提环境 拉取镜像 创建容器 创建mysql容器&#xff1a; 创建OwnCloud容器&#xff0c;并连接到数据库&#xff1a; 创建Nginx容器&#xff1a; 配置nignx 前提环境 基于Centos7.9版本环境安装Docker-ce&#xff1a;24.0.5 拉取镜像 docker pull mysql:5.6 dock…

Leetcode每日一题:1267. 统计参与通信的服务器(2023.8.24 C++)

目录 1267. 统计参与通信的服务器 题目描述&#xff1a; 实现代码与解析&#xff1a; 写法一&#xff1a;两次遍历 hash 原理思路&#xff1a; 写法二&#xff1a;三次遍历 原理思路&#xff1a; 1267. 统计参与通信的服务器 题目描述&#xff1a; 这里有一幅服务器分…

Jetson Xavier NX安装torch环境

设备简介 Jetson Xavier NX是一款具有强大计算能力的AI处理器&#xff0c;它采用了NVIDIA的Turing架构和Volta GPU架构&#xff0c;可以实现高性能的深度学习和推理任务。具体性能如下&#xff1a; CPU&#xff1a;6核心ARM Cortex-A57处理器&#xff0c;最高主频1.5GHz。 GP…

平衡二叉树及其应用详解

平衡二叉树 定义与性质 平衡二叉树&#xff08;Balanced Binary Tree&#xff09;是计算机科学中的一种数据结构&#xff0c;它是二叉排序树的一种特殊情况。 平衡二叉树满足以下性质&#xff1a; 左子树和右子树的高度差不超过 1。也就是说&#xff0c;对于任意节点&#…

6. 激活层

6.1 非线性激活 ① inplace为原地替换&#xff0c;若为True&#xff0c;则变量的值被替换。若为False&#xff0c;则会创建一个新变量&#xff0c;将函数处理后的值赋值给新变量&#xff0c;原始变量的值没有修改。 import torch from torch import nn from torch.nn import …

Squaretest 1.8.3 安装激活

1. 插件下载 2. 离线安装 3. 插件激活

Apache Paimon 实时数据湖 Streaming Lakehouse 的存储底座

摘要&#xff1a;本文整理自阿里云开源大数据表存储团队负责人&#xff0c;阿里巴巴高级技术专家李劲松&#xff08;之信&#xff09;&#xff0c;在 Streaming Lakehouse Meetup 的分享。内容主要分为四个部分&#xff1a; 流计算邂逅数据湖 Paimon CDC 实时入湖 Paimon 不止…

IDEA使用git

文章目录 给所有文件配置git初始化本地仓库创建.gitignore文件添加远程仓库分支操作 给所有文件配置git 初始化本地仓库 创建.gitignore文件 添加远程仓库 分支操作 新建分支 newbranch 切换分支 checkout 推送分支 push 合并分支 merge

MySQL索引、事务与存储引擎

1索引 索引的概念&#xff1a; 数据库索引 是一个排序的列表&#xff0c;存储着索引值和这个值所对应的物理地址&#xff0c;无须对整个表进行扫描&#xff0c;通过物理地址就可以找到所需数据&#xff0c;是表中一列或者若千列值排序的方法&#xff0c;需要额外的磁盘空间 …

2023年05月 C/C++(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题&#xff1a;怪盗基德的滑翔翼 怪盗基德是一个充满传奇色彩的怪盗&#xff0c;专门以珠宝为目标的超级盗窃犯。而他最为突出的地方&#xff0c;就是他每次都能逃脱中村警部的重重围堵&#xff0c;而这也很大程度上是多亏了他随身携带的便于操作的滑翔翼。 有一天&#xff…

计算机毕设 基于机器视觉的二维码识别检测 - opencv 二维码 识别检测 机器视觉

文章目录 0 简介1 二维码检测2 算法实现流程3 特征提取4 特征分类5 后处理6 代码实现5 最后 0 简介 今天学长向大家介绍一个机器视觉的毕设项目&#xff0c;二维码 / 条形码检测与识别 基于机器学习的二维码识别检测 - opencv 二维码 识别检测 机器视觉 1 二维码检测 物体检…

一文便知 GO 中mongodb 的安装与使用

MONGDB 安装与使用 咱们来回顾一下上次分享的内容&#xff1a; 如何使用log 包log 包原理和具体实现自定义日志 要是对 GO 的日志包还有点兴趣的话&#xff0c;可以查看文章 GO的日志怎么玩 ? 今天咱们来玩个简单的 mongodb 的安装和使用 MONGODB介绍 MongoDB 是一个基于…

Prometheus关于微服务的监控

在微服务架构下随着服务越来越多,定位问题也变得越来越复杂,因此监控服务的运行状态以及针对异常状态及时的发出告警也成为微服务治理不可或缺的一环。服务的监控主要有日志监控、调用链路监控、指标监控等几种类型方式,其中指标监控在整个微服务监控中比重最高,也是实际生…

CTF-XXE(持续更新,欢迎分享更多相关知识点的题目)

知识 实例 BUU [PHP]XXE 进来看到 然后一起看 Write BUU XXE COURSE 1 进来看到 一起看 write NSS [NCTF2019]Fake XML cookbook 反正是XXE 直接整 write [NCTF 2019]True XML cookbook 不整花里胡哨&#xff0c;解题在最下面 write 与博主不同&#xff0c;我通过…

Visual Studio 2022的MFC框架——WinMain函数

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天我们来重新审视一下Visual Studio 2022下开发工具的MFC框架知识。 大家还记得创建Win32应用程序是怎么弄的吗&#xff1f; Win32应用程序的建立到运行是有一个个关系分明的步骤的&#xff1a; 1.进入W…

C#获取DataTable的前N行数据然后按指定字段排序

获取DataTable的前N行数据然后按指定字段排序 可以使用以下三种代码&#xff1a; 第一种&#xff1a;使用Linq DataTable dtLast dataTable.AsEnumerable().Take(count).OrderBy(dataRow > Convert.ToInt32(dataRow["Sequence"])).CopyToDataTable(); 第二种…

npm yarn pnpm npx nvm 命令怎么区分怎么用

npm​​​​​​​ 包管理器&#xff0c;可以用来安装、卸载、更新和管理各种包npm的package.json中文文档 参数 - install&#xff1a;安装一个或多个包。例如&#xff1a;npm install 。 uninstall&#xff1a;卸载一个包。例如&#xff1a;npm uninstall 。 update&#xf…

【Python】从入门到上头—Python基础(2)

文章目录 一.基础语法1.编码2.标识符3.保留字4.注释5.行与缩进6.多行语句7.数字(Number)类型8.字符串(String)9.空行10.等待用户输入11.同一行显示多条语句12.多个语句构成代码组13.print 输出14.import 与 from...import 二.基本数据类型1.变量和赋值2.多个变量赋值3.标准数据…