cpp算法题目整理——线性枚举篇2

发布时间:2026/9/26 20:04:40
cpp算法题目整理——线性枚举篇2 三元组中心问题题目描述在数列 a1,a2,⋯,ana1​,a2​,⋯,an​ 中如果对于下标 i,j,ki 满足 0ijkn1 且 aiajak​则称 ai,aj,ak 为一组递增三元组aj为递增三元组的中心。给定一个数列请问数列中有多少个元素可能是递增三元组的中心。解题思路这个题目不能下意识用三层循环解决用三层循环会导致重复计数因此引入两个bool值用来判断j前面有没有小于他的元素j后面有没有大于他的元素有的话就直接break因为只要存在一个小于、大于j的数就能说明j就是三元组的中心而且这样还是两层循环。拿硬币题目描述桌上有n堆力扣币每堆的数量保存在数组coins中。我们每次可以选择任意一堆拿走其中的一枚或者两枚求拿完所有力扣币的最少次数。解题思路我是先定义了一个哈希表unordered_map mint,int;然后定义了m[1]、m[2]的次数为0接着for循环遍历整个coins然后去判断每个coins[i]需要多少次2多少次1因为求次数最小值所以肯定优先拿2个如果刚好取完那就将次数加在m[2]上然后直接break如果有余数那必定为1然后m[1]即可然后break等待遍历完之后写一个sum求出m[1]和m[2]出现的次数并返回即可。删除有序数组中的重复元素题目描述给你一个 非严格递增排列的数组nums请你原地删除重复出现的元素使每个元素只出现一次 返回删除后数组的新长度。元素的相对顺序 应该保持 一致 。然后返回nums中唯一元素的个数。考虑nums的唯一元素的数量为k。去重后返回唯一元素的数量k。nums的前k个元素应包含排序后的唯一数字。下标k - 1之后的剩余元素可以忽略。解题思路利用双指针遍历slow0fast1然后遍历整个数组fastnums.size();fast; 然后当nums[slow] ! nums[fast]的时候将slow向前移动然后将fast的值赋值给slow这样一来就会把后边的值赋值给第一个重复元素的第二个值依次往后重复元素就会被逐个替代最后返回slow1就是数组长度。将找到的值乘以2题目描述给你一个整数数组nums另给你一个整数original这是需要在nums中搜索的第一个数字。接下来你需要按下述步骤操作如果在nums中找到original将original乘以 2 得到新original即令original 2 * original。否则停止这一过程。只要能在数组中找到新original就对新original继续重复这一过程。返回original的最终值解题思路这个也是进行for循环但是i不能放在for循坏内层应该进行判断因为original每次变化之后都需要从头遍历数组因此当找到这个original的时候需要将i重新置为0num[i]不等于original的时候才进行i猜数字题目描述猜数字游戏是gameboy最喜欢的游戏之一。游戏的规则是这样的计算机随机产生一个四位数然后玩家猜这个四位数是什么。每猜一个数计算机都会告诉玩家猜对几个数字其中有几个数字在正确的位置上。比如计算机随机产生的数字为1122。如果玩家猜1234,因为1,2这两个数字同时存在于这两个数中而且1在这两个数中的位置是相同的所以计算机会告诉玩家猜对了2个数字其中一个在正确的位置。如果玩家猜1111,那么计算机会告诉他猜对2个数字有2个在正确的位置。现在给你一段gameboy与计算机的对话过程你的任务是根据这段对话确定这个四位数是什么。输入数据有多组。每组的第一行为一个正整数N(1N100)表示在这段对话中共有N次问答。在接下来的N行中每行三个整数A,B,C。gameboy猜这个四位数为A然后计算机回答猜对了B个数字其中C个在正确的位置上。当N0时输入数据结束。每组输入数据对应一行输出。如果根据这段对话能确定这个四位数则输出这个四位数若不能则输出Not sure。解题思路这个题目是我做过的最复杂也是难度最高的问题了也是直接遍历四位数嘛从1000开始到9999然后将每个数字去和输入的猜测值正确数字的个数正确数字的位置进行匹配找到满足匹配所有条件的cand再进行输出主要分为两大块一是验证条件c一是验证条件b验证之后输出即可如果不存在就输出not sure就行。这个题目对我来说是最难的。