D349周赛:注意题目提示里,数据范围隐含的算法复杂度提示
文章目录
- 6470.既不是最大值也不是最小值
- 完整版
- 为什么两个for循环时间复杂度还是不变的
- 6465.执行子串操作后的字典序最小字符串
- 思路
- 最开始的写法
- 题意理解的问题
- 修改版
- 'a'必须单独拿出来的原因
- 6449.收集巧克力
- 思路
- 注意提示信息
- 完整版
- 补充:由数据范围反推算法复杂度及算法内容
6470.既不是最大值也不是最小值
- 同一数组遍历两遍,时间复杂度还是O(n)
- erase操作会增加额外的时间开销
给你一个整数数组 nums
,数组由 不同正整数 组成,请你找出并返回数组中 任一 既不是 最小值 也不是 最大值 的数字,如果不存在这样的数字,返回 -1
。
返回所选整数。
示例 1:
输入:nums = [3,2,1,4]
输出:2
解释:在这个示例中,最小值是 1 ,最大值是 4 。因此,2 或 3 都是有效答案。
示例 2:
输入:nums = [1,2]
输出:-1
解释:由于不存在既不是最大值也不是最小值的数字,我们无法选出满足题目给定条件的数字。因此,不存在答案,返回 -1 。
完整版
- 主要是注意,这种删除nums元素的写法,删除了max的索引之后,min的索引值也会变化,因此需要进行前后索引值的判断!
- erase的用法是
nums.erase(nums.begin()+maxIndex);
传入的是迭代器
class Solution {
public:int findNonMinOrMax(vector<int>& nums) {int max = nums[0];int maxIndex = 0;int min = nums[0];int minIndex = 0;//测试用例输入[1]的时候,预期输出是-1,后期修改if(nums.size()==1){return -1;}for(int i=0; i<nums.size(); i++){if(nums[i] > max){max = nums[i];maxIndex = i;}if(nums[i] < min){min = nums[i];minIndex = i;}}// 如果最大值在最小值之前,先删除最大值,然后再删除最小值,注意删除最大值后最小值索引需要减一if(maxIndex < minIndex) {nums.erase(nums.begin() + maxIndex);nums.erase(nums.begin() + minIndex - 1);} else {// 如果最小值在最大值之前,先删除最小值,然后再删除最大值nums.erase(nums.begin() + minIndex);nums.erase(nums.begin() + maxIndex - 1);}if(!nums.empty()){return nums[0];}elsereturn -1; }
};
这种写法还是写复杂了,时间复杂度是O(n),实际上用两个for循环时间复杂度也是O(n)
class Solution {
public:int findDifferentNumber(vector<int>& nums) {int min_val = INT_MAX;int max_val = INT_MIN;for (int num : nums) {min_val = min(min_val, num);max_val = max(max_val, num);}for (int num : nums) {if (num != min_val && num != max_val) {return num;}}return -1;}
};
为什么两个for循环时间复杂度还是不变的
两种方法在时间复杂度上都是O(n),因为它们都需要遍历整个数组。这里的n表示数组的大小。两次遍历数组并不会改变时间复杂度的大O标记,因为O(2n)仍然等于O(n)。因此同一个数组遍历两遍,时间复杂度依然是O(n)。
空间复杂度上,两种方法也都是O(1),因为它们都只使用了有限数量的变量,且这个数量与输入数组的大小无关。
但是,就实际运行时间而言,第二种方法可能会更快一些。原因有两个:
- 没有使用erase操作,erase操作会导致数组中剩余的元素移动,从而增加额外的时间开销。
- 第二种方法在找到一个不是最小或最大的数字后就立即返回,而不是总是遍历整个数组。
所以在最好的情况下,第二种方法的时间复杂度实际上可能比O(n)更低。
6465.执行子串操作后的字典序最小字符串
- ASCII码字符的加减可以直接’b’+1=‘c’,但是a的减法是特殊情况。‘a’-1是不可打印字符,需要单独赋值。
- 这道题重点在于题意理解。子字符串并没有规定长度,但是我们需要操作一个子字符串。
- 尽量减少字典序的方式就是字符串中**'a’尽可能多**。但是,如果原本的字符串全是a,也必须进行一次操作。
给你一个仅由小写英文字母组成的字符串 s
。在一步操作中,你可以完成以下行为:
- 选则
s
的任一非空子字符串,可能是整个字符串,接着将字符串中的每一个字符替换为英文字母表中的前一个字符。例如,‘b’ 用 ‘a’ 替换,‘a’ 用 ‘z’ 替换。
返回执行上述操作 恰好一次 后可以获得的 字典序最小 的字符串。
子字符串 是字符串中的一个连续字符序列。
现有长度相同的两个字符串 x
和 字符串 y
,在满足 x[i] != y[i]
的第一个位置 i
上,如果 x[i]
在字母表中先于 y[i]
出现,则认为字符串 x
比字符串 y
字典序更小 。
示例 1:
输入:s = "cbabc"
输出:"baabc"
解释:我们选择从下标 0 开始、到下标 1 结束的子字符串执行操作。
可以证明最终得到的字符串是字典序最小的。
示例 2:
输入:s = "acbbc"
输出:"abaab"
解释:我们选择从下标 1 开始、到下标 4 结束的子字符串执行操作。
可以证明最终得到的字符串是字典序最小的。
示例 3:
输入:s = "leetcode"
输出:"kddsbncd"
解释:我们选择整个字符串执行操作。
可以证明最终得到的字符串是字典序最小的。
提示:
1 <= s.length <= 3 * 105
s
仅由小写英文字母组成
思路
这道题题意感觉不太好理解,首先选择的是子字符串,子字符串的长度并没有规定。
另外,恰好一次指的是只操作一个子字符串。并且必须操作,不能不操作原样返回。
在这个问题中,一个关键的点是如果字符串中有’a’,我们应该尽可能地避免改变它前面的字符,因为’a’已经是最小的字符,不能再被减小。
所以我们可以找到第一个’a’字符,并将其前面的所有字符减一。如果字符串中没有’a’,那么我们只需简单地减少整个字符串的每个字符。
最开始的写法
class Solution {
public:string smallestString(string s) {if(s.size() == 1 && s[0] == 'a'){return "z";}int n = s.size();for(int i = 0; i < n; ++i) {if(s[i] != 'a') {while(i < n && s[i] != 'a') {s[i] = s[i] - 1 == 'a' - 1 ? 'z' : s[i] - 1;++i;}break;}}return s;}
};
这个写法存在的问题在于,当输入"aa"的时候,预期输出是"az",而不是"aa"。
题意理解的问题
输入"aa"的时候,字典序最小的字符串确实还是"aa"。但是,题目要求我们必须执行恰好一次操作,这就意味着我们必须选择字符串中的至少一个字符进行替换。
在这种情况下,最好的策略就是尽可能保留字典序较小的字符,也就是只将最后一个’a’替换为’z’,得到"az"。因为’z’在字母表中的位置较后,所以"az"是在执行一次操作后能得到的字典序最小的字符串。
修改版
- 保证每一个非’a’字符都会被减小,使得结果字符串尽可能地小。同时,遇到’a’就停止替换,保证了不会无意义地增大字符串。
class Solution {
public:string smallestString(string s) {//特殊测试用例,后来添加if(s.size()==1&&s[0]=='a'){return "z";}int n = s.size();int i = 0;//"a"的部分不动while(i < n && s[i] == 'a') {i++;}if(i == n) { // 如果所有的字符都是 'a',我们还是需要进行一次操作s[n-1] = 'z';} else {//遇到a的时候,停止替换while(i < n && s[i] != 'a') {s[i] = s[i] - 1;i++;}}return s; }
};
'a’必须单独拿出来的原因
'a' - 1
在ASCII码中是不可打印字符,所以用 s[i] - 1 == 'a' - 1
是在判断 s[i]
是否是字符 ‘a’。如果是 ‘a’,将其替换为 ‘z’ (因为题目中说 ‘a’ 需要替换为 ‘z’);否则,字符 s[i]
就被替换为它的前一个字符,即 s[i] - 1
。
ASCII码字符的加减可以直接’b’+1=‘c’,但是a的减法是特殊情况
6449.收集巧克力
- 注意本题的重点是,由于给出的限制条件nums长度在1000以内,所以可以考虑O(n^2)的算法!
给你一个长度为 n
、下标从 0 开始的整数数组 nums
,表示收集不同巧克力的成本。每个巧克力都对应一个不同的类型,最初,位于下标 i
的巧克力就对应第 i
个类型。
在一步操作中,你可以用成本 x
执行下述行为:
- 同时对于所有下标
0 <= i < n - 1
进行以下操作, 将下标i
处的巧克力的类型更改为下标(i + 1)
处的巧克力对应的类型。如果i == n - 1
,则该巧克力的类型将会变更为下标0
处巧克力对应的类型。
假设你可以执行任意次操作,请返回收集所有类型巧克力所需的最小成本。
示例 1:
输入:nums = [20,1,15], x = 5
输出:13
解释:最开始,巧克力的类型分别是 [0,1,2] 。我们可以用成本 1 购买第 1 个类型的巧克力。
接着,我们用成本 5 执行一次操作,巧克力的类型变更为 [2,0,1] 。我们可以用成本 1 购买第 0 个类型的巧克力。
然后,我们用成本 5 执行一次操作,巧克力的类型变更为 [1,2,0] 。我们可以用成本 1 购买第 2 个类型的巧克力。
因此,收集所有类型的巧克力需要的总成本是 (1 + 5 + 1 + 5 + 1) = 13 。可以证明这是一种最优方案。
示例 2:
输入:nums = [1,2,3], x = 4
输出:6
解释:我们将会按最初的成本收集全部三个类型的巧克力,而不需执行任何操作。因此,收集所有类型的巧克力需要的总成本是 1 + 2 + 3 = 6 。
提示:
1 <= nums.length <= 1000
1 <= nums[i] <= 109
1 <= x <= 109
思路
思路基于一个关键的观察:在收集所有类型巧克力的过程中,我们可以通过执行一次操作来在某种程度上改变巧克力类型的顺序。这意味着,如果某种类型的巧克力的成本比较高,我们可以通过一些操作使得它被替换成其他类型的巧克力,这样就可以降低总的收集成本。
注意提示信息
本题给出的n的大小是1000以内,也就是说可以使用O(n^2)的做法!
完整版
class Solution {
public:long long minCost(vector<int>& nums, int x) {long long ans = LLONG_MAX;int n = nums.size();vector<int> cost(n); // 记录每个点的最小花费for (int i = 0; i < n; ++i) cost[i] = nums[i]; for (int d = 0; d < n; ++d) { // 尝试移动d次long long cnt = 0; // 移动d次时的最小花费for (int i = 0; i < n; ++i) {int newcost = nums[(i - d + n) % n]; // 这个点移动d次是否找到了更少的花费cost[i] = min(cost[i], newcost);cnt += cost[i];}ans = min(ans, cnt + static_cast<long long>(d) * x);}return ans;}
};
这种写法,代码中的for
循环尝试了每一个可能的操作次数(从0到n-1
)。对于每一种可能的操作次数d
,计算了执行d
次操作之后的总成本。这个成本包括每种类型巧克力的最小成本以及执行操作的成本。
然后,它找出了这些成本中的最小值,这就是收集所有类型巧克力所需的最小成本。
在计算执行d
次操作之后的总成本时,对于每一个巧克力类型,都计算了执行d
次操作之后的成本(通过nums[(i - d + n) % n]
得到),并更新了当前类型的最小成本(通过min(cost[i], newcost)
得到)。这样,cost[i]
数组始终存储了对于每种类型,经过一系列操作之后的最小成本。
最后要注意的一点是,这种方法的时间复杂度是O(n^2),在n较大时可能无法在合理时间内完成计算。
但是本题给出的n的大小是1000以内,因此,O(n^2)这种方法是可以接受的。
补充:由数据范围反推算法复杂度及算法内容
参考:由数据范围反推算法复杂度以及算法内容 - AcWing
一般ACM或者笔试题的时间限制是1秒或2秒。
在这种情况下,C++代码中的操作次数控制在 10^7∼10^8
为最佳。
下面给出在不同数据范围下,代码的时间复杂度和算法该如何选择:
相关文章:
D349周赛:注意题目提示里,数据范围隐含的算法复杂度提示
文章目录 6470.既不是最大值也不是最小值完整版为什么两个for循环时间复杂度还是不变的 6465.执行子串操作后的字典序最小字符串思路最开始的写法题意理解的问题 修改版a必须单独拿出来的原因 6449.收集巧克力思路注意提示信息 完整版补充:由数据范围反推算法复杂度…...
iOS -- block one
demo贴上我的github blockOne 块类似于匿名函数或闭包,在许多其他编程语言中也存在类似的概念。 Block 以下是块的一些基本知识: 块的定义:块是由一对花括号 {} 包围的代码片段,可以包含一段可执行的代码。块的定义使用 ^ 符号…...
第十二篇:强化学习SARSA算法
你好,我是郭震(zhenguo) 今天强化学习第二十篇:强化学习SARSA算法 1 历史 SARSA(「State-Action-Reward-State-Action」)算法是一种经典的强化学习算法,用于解决马尔可夫决策过程(MDP࿰…...
电力vr智能巡检模拟实操教学灵活性高成本低
传统电力智能运检服务培训采用交接班期间开展智能带电检测仪器的操作培训,教学时间、场地及材料有限,有了VR技术,将推动电力智能运检服务培训走向高科技、高效率和智能化水平。 深圳华锐视点凭借着对VR实训系统的深入研发和升级,多…...
vscode右键点击,松开后自动触发鼠标所在位置的按钮(误触发双击效果)
例如如下,右键展开菜单,松手会自动触发转到声明功能 解决方案: 1、安装easystroke sudo apt-get install easystroke 2、打开easystroke,选择preferences tab 3、点击Gesture Button,在出现的框中右键单击一次 4、点…...
【UE5】分分钟简单使用像素流云服务(Pixel Streaming)
【UE5】分分钟简单使用像素流云服务(Pixel Streaming) 前言 UE5的Pixel Streaming已经封装的很好,简单三步实现简单的服务搭建。 安装插件打包项目运行服务 注:实例平台为Windows 安装插件 编辑→插件→输入查询Pixel Strea…...
2021 年全国硕士研究生入学统一考试管理类专业学位联考逻辑试题
2021 年全国硕士研究生入学统一考试管理类专业学位联考逻辑试题 一. 逻辑推理:第 26~55 小题,每小题 2 分,共 60 分。下列每题给出的 A、B、C、D、E 五个选项中,只有一项是符合试题要求的。 26.哲学是关于世界观、方法论的学问。哲…...
【算法】【算法杂谈】两个排序数组中找第k小的数
目录 前言问题介绍解决方案代码编写java语言版本c语言版本c语言版本 思考感悟写在最后 前言 当前所有算法都使用测试用例运行过,但是不保证100%的测试用例,如果存在问题务必联系批评指正~ 在此感谢左大神让我对算法有了新的感悟认识! 问题介…...
ABAP 新语法--Open SQL(草稿)
1. 常量 1.1 常量赋值 常量字段可以用来为内表中的部分字段赋初始值,字段类型和长度依据输入常量的值决定 SELECTmara~matnr, " 物料号mara~matkl, " 物料组mara~mtart, " 物料类型 AS lkenz, " 删除标识,常量空字符串123 AS fla…...
2023最新常用开发网站汇总
1、在线画图工具 • 在线画图工具ProcessOn:https://www.processon.com/ • 在线画图工具draw.io:https://app.diagrams.net/ • 在线思维导图工具:http://www.mindline.cn/webapp • PlantUML在线编辑器:http://haha98k.com/…...
ELK 日志采集使用
1.安装ELK整体环境 1.1.安装docker环境 Docker 最新版Version 20.10安装_docker最新版本是多少_猿小飞的博客-CSDN博客 1.2.先安装docker compose 安装docker compose_猿小飞的博客-CSDN博客 1.3.使用 Docker Compose 搭建 ELK 环境 1.3.1.编写 docker-compose.yml 脚本启…...
深入剖析RocketMQ源码:消息传递的奥秘
RocketMQ是一款高性能、高可靠性、可扩展性强的分布式消息中间件,能够有效架构企业级分布式应用。由于其广泛应用和优秀表现,越来越多的开发者对RocketMQ的底层实现产生了浓厚的兴趣。本文将深入剖析RocketMQ的消息传递奥秘,帮助大家了解RocketMQ的底层实现原理,进一步掌握…...
Protocol https not supported or disabled in libcurl
原因 curl默认安装完后是只支持http协议而不支持https协议的。 curl -V查看当前curl支持哪些协议: [rootlocalhost /]# curl -V curl 7.19.4 (x86_64-unknown-linux-gnu) libcurl/7.19.4 OpenSSL/1.0.2k zlib/1.2.11 Protocols: tftp ftp telnet dict http fil…...
一步步搭建基于 ts + express + prisma + mongodb + zod 后端服务
环境: windows11、node 18.16.0 、pnpm 1、在合适位置,代开 vscode , 终端执行 mkdir miaooo-backend && cd miaooo-backend && npm init -y 。 创建一个名为一个 miaooo-backend 的项目,并且进入项目 执行 npm 默认初始化。…...
深入理解深度学习——Transformer:编码器(Encoder)部分
分类目录:《深入理解深度学习》总目录 Transformer中的编码器不止一个,而是由一组 N N N个编码器串联而成。一个编码器的输出作为下一个编码器的输入。在下图中有 N N N个编码器,每一个编码器都从下方接收数据,再输出给上方。以此…...
【图像处理】基于收缩系数的粒子群优化和引力搜索算法的多级图像阈值研究【CPSOGSA】(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
PortSwigger web缓存中毒(Cache Poisoning)
一、什么web缓存中毒? Web缓存中毒(Web Cache Poisoning)是一种攻击技术,攻击者通过操纵Web应用程序的缓存系统,将恶意或欺骗性内容注入到合法的缓存中,以欺骗用户或绕过安全控制。 Web缓存中毒的原理是利用…...
msf渗透练习-生成木马控制window系统
说明: 本章内容,仅供学习,不要用于非法用途(做个好白帽) (一)生成木马 命令: msfvenom -p windows/meterpreter/reverse_tcp LHOST192.168.23.46 LPORT4444 -e x86/shikata_ga_nai -…...
【c++】组合类+继承情况下构造顺序
组合类继承情况下构造顺序 构造顺序同普通继承,先父后子,内部类是最老的(最先调用构造的)。 示例代码 class A { public:A(int a 0):_a(a){cout << "A()" << endl;}~A(){cout << "~A()" …...
盛元广通生物化学重点实验室化学品信息化安全管理系统
生物化学重点实验室是国家基础研究和高技术研究的重要基地,是培养和造就高层次创新型人才的重要基地。为保障实验室化学品安全使用,实验人员可通过现场或移动端管理系统实现化学品安全使用与存储。盛元广通生物化学重点实验室化学品信息化安全管理系统具…...
1.知识积累
(1)build_chain.sh 脚本: build_chain.sh 脚本是 FISCO BCOS 提供的一个工具脚本,用于自动化构建 FISCO BCOS 联盟链。它可以帮助您快速搭建和配置多节点的区块链网络。 具体而言,build_chain.sh 脚本的作用包括以下…...
20230612----重返学习-函数式编程-数据类型检测-网络层优化
day-090-ninety-20230612-函数式编程-数据类型检测-网络层优化 函数式编程 函数式编程 && 命令式编程 函数式编程:把具体的操作过程“封装”到一个函数中,我们无需关注内部是如何处理的(How),只需要关注处理的结果(What)即可; // 如果是依次迭代数组每一项,…...
Java实现删除txt第一行
如果您的文件很大,则可以使用以下方法在不使用临时文件或将所有内容加载到内存中的情况下执行删除. public static void removeFirstLine(String fileName) throws IOException { RandomAccessFile raf new RandomAccessFile(fileName, "rw"); …...
Go语言函数式编程库samber/lo
Go语言函数式编程库samber/lo 开发中,我们经常遇到一些操作,比如获取一个map的所有key,所有value,判断一个字符串是否出现在slice 中,slice中是否有重复元素等等。Go语言没有这样的操作,标准库也不提供。…...
自定义杰理AC63系列BLE数据发送函数
自定义BLE数据发送函数,就是将数据发送、数据发送前的检查、以及conn_handle查询等封装在一起,脱离SDK中的相关回调函数,在程序任意位置实现发送数据功能。 1. SDK中的BLE数据发送函数 BLE的数据发送函数定义在apps\common\third_party_pro…...
Jenkins结合gitee自动化部署SpringBoot项目
安装 安装教程 插件选择 Gitee Plugin 配置 源码管理 填写源码地址 注意:请确保genkins所在的服务器有权限git拉取远程仓库代码,如果不可以请参考ssh配置centos 配置ssh拉取远程git代码 源码管理 构建触发器 1.勾选Gitee webhook 触发构建 2.生成we…...
声强级和声压级之间的转换举例
声强级和声压级之间的转换举例 在学习声学时候,经常会遇到声强级和声压级的概念,而且它们的单位都是分贝(dB),很容易混淆这两个概念。而且,更容易在计算时候,不知如何转换,如何使用,本文将举例说明两者之间…...
16 粒子滤波
文章目录 16 粒子滤波16.1 背景介绍16.1.1 Particle Filter是什么?16.1.2 Patricle Filter的状态如何转移?16.1.3 如何通过采样求解Particle Filter 16.2 重要性采样16.2.1 重要性采样方法16.2.2 Sequential Importance Sampling16.2.3 Resampling16.2.4…...
【appium】appium自动化入门之API(下)——两万字API长文,建议收藏
目录 Appium API 前言 1.contexts (返回当前会话中的上下文,使用后可以识别 H5 页面的控件) 2.current_context (返回当前会话的当前上下文 ) 3. context (返回当前会话的当前上下文) 4.find_e…...
开发改了接口,经常忘通知测试的解决方案!
目录 前言: Apifox解决方案 Apifox对此给出的解决方案是: 用Apifox怎么处理接口变更 接口代码实现逻辑修改 接口参数修改 前言: 在开发过程中,接口变动十分频繁,测试人员没有及时获得相关通知的情况也很普遍。这…...
自助建站系统源码下载/开源crm系统
联想thinkpad e580笔记本网卡驱动是款不错的lenovo系列的驱动程序,如果您的联想笔记本出现无法识别网卡驱动或网络卡顿等情况,可以来本站下载此e580网卡驱动帮助您有效的解决相关问题等,欢迎有需要的用户前来下载!联想e580网卡驱动…...
江苏连云港网站建设公司/牡丹江seo
会有如题的思考,是因为我一直有一个疑问java文件的编码会影响字符串的编码嘛? 因此自然而然就想到了java编译后的文件的编码。 1 javac在控制台编译java类文件 手动建立一个java文件Demo.java,并保存。 此时Demo.java文件的编码为ANSI,中…...
网站制作网站/深圳优化公司
在Qtpro文件中添加Qtgui QImage的帮助中写的很清楚 Header: #include <QImage> qmake: QT gui...
牛商网做的网站怎么样/怎么网络推广
这个是Ralph kimball ETL的书籍,其中第10章主要讲如何管理数据仓库团队,ETL团队是属于数据仓库团队的;第一章和第二章是概况性的介绍,强烈建议大家都看下1/2/10章,对于大家形成对数据仓库和ETL共同的认识。 下面和大家…...
做网站较好的框架/长沙网站seo诊断
phpStudy在windows上配置php运行环境非常方便,使用简单省心。在本地调试wordpress网站,我就是用phpStudy来配置环境的,可是最近遇到一个烦心的事情,就是phpStudy一直运行良好,突然Apache和MySQL服务就启动不了。故障的…...
手机网站 宽度/台州网站制作维护
传送门:poj 1077 Eight 题目大意 输入的八数码 将一个八数码最后转换为 1 2 3 4 5 6 7 8 x 的格式,然后打印出路径 康拓展开 如果按照平常的思路,把x的位置看做0,一共有8!个状态,来判断某一个状态…...