获得徽章 7
#刷题交流#
day22: 小M的订单编号问题
解题思路:
1. 假设有一个订单序号 x 和编号上限 m,那么每当 x 大于 m 时,编号会从 1 重新开始。
2. 计算第 x 个订单的编号,其实就是求 x % m 的结果。如果余数为 0,说明编号是 m,否则编号就是余数。
解毕.
展开
评论
#刷题交流#
day21: 迷人子序列计数问题
解题思路:
1. 滑动窗口(双指针法): 使用滑动窗口的方式,保持一个有效的窗口,其中窗口内的元素的最大值和最小值之差不超过给定的阈值 k。通过动态地扩展和收缩窗口,可以高效地计算所有满足条件的子序列数量。
2. 核心思路:
(1)使用两个指针 left 和 right 来表示当前子序列的左右边界。
(2)遍历 right 从左到右,扩大窗口。
(3)当窗口内的元素的最大值和最小值之差超过 k 时,移动 left 指针,收缩窗口,直到满足条件。
(4)在每一步,计算当前有效的子序列数量。对于每个 right,当前有效的子序列个数为 right - left + 1。
3. 使用 max_queue 和 min_queue 来维护当前窗口的最大值和最小值。这里可以利用双端队列(deque)来实现高效的最大值和最小值查询。
解毕.
展开
评论
#刷题交流#
day20: 小E的射击训练
解题思路
1. 计算射击点与靶心的距离:x**2 + y**2。
2. 判断距离所在的环数,根据环数来确定得分。如果距离小于等于某个半径,则得分为 11-i。
3. 如果距离大于 10,则得分为 0。
解毕.
展开
评论
#刷题交流#
day19: 贪心猫的鱼干大分配
解题思路:
1. 初始化每只猫的鱼干分配,初始值为1。
2. 从左到右遍历:确保每只猫的鱼干数满足比左边等级低的猫多。
3. 从右到左遍历:确保每只猫的鱼干数满足比右边等级低的猫多,同时取两次分配中的较大值。
4. 返回鱼干总数。
解毕.
展开
评论
#刷题交流#
day18: 统计班级中的说谎者
1. 使用 Python 内置的 sorted 函数对输入的成绩列表 A 进行排序,得到 sorted_A,排序后的列表方便后续查找和比较不同成绩的相对位置以及数量关系。
2. 对于 sorted_A 中的每个成绩 current_score(通过 for 循环遍历),需要统计出成绩小于等于它的数量以及大于它的数量来判断是否说谎。
3. 采用二分查找(通过 while 循环实现)在 sorted_A 中查找与当前成绩 current_score 相等的成绩。找到相等成绩后,通过两个 while 循环向左右两边扩展,统计出所有与当前成绩相等的成绩数量 equal_count。
4. 根据二分查找结束后的左指针 left 以及统计出的相等成绩数量 equal_count,可以计算出成绩小于等于当前成绩的数量 less_or_equal_count(其值为 left + equal_count - 1,因为 left 指向的是第一个大于当前成绩的位置,所以小于等于当前成绩的位置数量要减去 1 并加上相等成绩的数量),而大于当前成绩的数量 greater_count 就是总学生数量 n 减去 less_or_equal_count。
5. 如果 less_or_equal_count 大于 greater_count,说明当前成绩对应的学生满足说谎条件,此时将与当前成绩相等的学生数量 equal_count 累加到结果 result 中,因为所有这些成绩相同的学生都会说谎。
解毕.
展开
评论
#刷题交流#
day17: 饭馆菜品选择问题
解题思路:
1.定义状态: 定义一个三维的动态规划数组 dp[i][j][l],其中 i 表示考虑前 i 道菜(范围是从 1 到 n),j 表示已经选了 j 道菜(范围是从 0 到 k),l 表示所选的 j 道菜中含有蘑菇的菜有 l 道(范围是从 0 到 m)。dp[i][j][l] 的值代表在相应状态下能得到的最小总价格。
2. 初始化边界条件:当什么菜都还没选的时候(即 i = 0,j = 0,l = 0),总价格自然是 0,所以 dp[0][0][0] = 0,而其他的 dp[0][j][l](j 和 l 不为 0 时)初始化为正无穷大,表示不可达状态,因为一开始没菜可选的情况下不可能有其他选择数量和含蘑菇菜数量的组合情况。
3. 状态转移方程推导: 对于每一道菜(遍历 i 从 1 到 n),有两种选择:选这道菜或者不选这道菜。
4. 在遍历完所有的菜(i = n),且选择 k 道菜(j = k)的各种含蘑菇菜数量(l 从 0 到 m)的状态中,找到最小的总价格值 min(dp[n][k])。如果这个最小值是正无穷大,说明无法按照要求选出 k 道菜,返回 -1;否则返回这个计算得到的最小总价格。
解毕.
展开
评论
#刷题交流#
day16: 数组元素之和最小化
解题思路:
1. 确保所有元素的最大公约数为k:数组中的所有元素必须是 k 的倍数, 因此我们可以从k开始, 构造数组元素为k,2k,3k...。
2. 保证数组中元素两两不同:上述方法自然满足条件,因为每个元素是k的倍数,且倍数不同。
3. 使数组元素之和尽可能小:选取前 n 个最小的倍数, 即k, 2k, 3k ... nk。
解毕.
展开
评论
#刷题交流#
day15: 优秀项目组初选评比
解题思路:
1. 排序:首先对得分数组 a 进行升序排序,这样我们就能更容易地查找满足条件的分数线。
2. 遍历所有可能的分数线:可以考虑所有的分数线 x 为数组 a 中的每一个得分。
3. 计算晋级与淘汰的数量:对于每一个分数线 x,我们可以计算得分大于 x 的项目组数量,进而计算得分小于或等于 x 的项目组数量。
4. 检查是否符合条件:检查得分大于 x 的项目组数量是否在区间 [m, n] 之间,如果是,则这个 x 是一个候选分数线。记录最小的满足条件的 x。
5. 返回结果:如果找到了合适的分数线,则返回该分数线;如果没有找到,返回 -1。
解毕.
展开
评论
#刷题交流#
day14: 及格的组合方式探索
1. 动态规划状态 dp[i][s] 可以表示前 i 门课程的组合中,总分为 s 的情况。这个状态可以通过从前一状态转移得到。
2. 初始时,dp[0][0] = 1,表示没有课程时总分为0的情况。
3. 通过逐步加入课程和成绩,更新状态,最后求出总和符合条件的组合数。
4. 对最终的结果取模 202220222022。
解毕.
展开
评论
#刷题交流#
day13: 小U的数字插入问题
问题解析:
1. 将 a 和 b 都转换成字符串形式,便于操作。
2. 通过遍历 a 字符串的每个位置,在每个位置插入 b 字符串,然后计算结果。
3. 比较每次插入后的结果,找出最大的那个。
解毕。
展开
评论
#刷题交流#
day12: DNA序列编辑距离
解题思路:
1. 定义状态:设 dp[i][j] 表示将 dna1[0..i-1] 转换成 dna2[0..j-1] 所需的最少编辑步骤。
2. 状态转移:如果 dna1[i-1] == dna2[j-1],那么 dp[i][j] = dp[i-1][j-1],因为不需要任何编辑。
如果 dna1[i-1] != dna2[j-1],我们有三种操作:
插入:在 dna1 中插入一个字符,操作后变成 dp[i][j-1] + 1。
删除:删除 dna1[i-1] 中的一个字符,操作后变成 dp[i-1][j] + 1。
替换:将 dna1[i-1] 替换为 dna2[j-1],操作后变成 dp[i-1][j-1] + 1。
初始化:dp[0][j] 表示将空字符串转换为 dna2[0..j-1],需要 j 次插入;dp[i][0] 表示将 dna1[0..i-1] 转换为空字符串,需要 i 次删除。
返回结果:最终的编辑距离是 dp[m][n],其中 m 和 n 分别是 dna1 和 dna2 的长度。
解毕.
展开
评论
#刷题交流#
day11: 小M的多任务下载器挑战106
解题思路:
1. 任务的区间表示:每个任务的下载时间可以表示为一个区间 [x, x + y],其中 x 是任务的开始时间,y 是任务的持续时间,x + y 是任务的结束时间。
2. 事件模拟:可以将每个任务的开始和结束时间视作“事件”。每个任务会有两个事件:一个是开始下载的时刻,另一个是结束下载的时刻。对于每个任务,记录下这两个事件,并将其按照时间顺序进行排序。
3. 计算并发数:当任务开始时,当前并发数加1;当任务结束时,当前并发数减1。通过遍历所有事件,计算并发数的最大值。
解毕
展开
评论
#刷题交流#
day10: 比赛配对问题
解题思路:
1. 每轮比赛的配对次数是由当前队伍数决定的:如果队伍数是偶数,则进行 n / 2 场比赛;如果队伍数是奇数,则进行 (n - 1) / 2 场比赛。
2. 每一轮后,队伍数会减少一半(如果是偶数),或者减少到 (n - 1) / 2 + 1(如果是奇数)。
3. 从初始队伍数 n 开始,每一轮比赛后,计算配对次数并更新剩余队伍数。
4. 重复这一过程,直到只剩一支队伍为止。
解毕.
展开
评论
#刷题交流#
day09: 构造特定数组的逆序拼接
解题思路:
1. 对于每个 i 从 1 到 n,需要生成一个从 n 到 i 的数组.
2. 将每个生成的数组拼接到一个结果数组中.
3. 最后返回拼接后的数组.
解毕
展开
评论
#刷题交流#
day08: 小F的永久代币卡回本计划
解题思路:
1. 如果b == 0:
如果每天返还 b 勾玉为 0,那么小F永远无法回本,因为每天没有返还,购买的代币卡价格永远不能被抵消。所以如果 b == 0,我们直接返回正无穷,表示无法回本.
2. 正常情况:b > 0:
每天返还 b 勾玉,因此如果小F登录了 x 天,她总共能返还的勾玉数为 x * b。
要使得返还的勾玉数至少等于代币卡的价格 a, 如果 a % b != 0(即 a 不能被 b 整除),那么我们需要多登录一天。
解毕.
展开
评论
#刷题交流#
day07: 找出单独的数
解题思路:
1. 定义函数 find_unique_number,它接受一个整数列表 numbers,这个列表代表班级同学卡片上的数字。
2. 初始化变量 result 为 ,然后通过循环遍历列表中的每个数字 num,并将其与 result 进行异或操作。
3. 最后返回的 result 就是那个只出现了一次的独特数字。
解毕
展开
评论
#刷题交流#
day06: 超市里的货物架调整
解题思路:
1. 读取输入数据,获取货架上的商品顺序和顾客想要购买的商品顺序。创建一个列表或队列来保存顾客的需求。
2. 需要通过对货架商品顺序的调整,确保尽可能多的顾客能够找到他们要买的商品。对货架商品进行排序,使得顾客最先能够找到他们最需要的商品。
3. 按照顾客的需求顺序,遍历货架商品,找出第一个符合顾客需求的商品并标记为已售出。
4. 统计被顾客购买的商品数量。
解毕
展开
评论
#刷题交流#
day05: 找出整型数组中占比超过一半的数
解题思路:
1. 遍历数组,使用 candidate 保存当前候选数字,count 保存计数。
2. 如果 count == 0,说明当前候选数字被消耗完,需要重新选取候选数字。
3. 如果当前数字等于候选数字,count += 1;否则 count -= 1。
4. 遍历完成后,candidate 是可能的多数元素,还需要确认它是否出现次数超过一半。用 array.count(candidate) 验证候选数字的次数。
5. 如果验证通过,返回候选数字;否则返回 0。
解毕
展开
评论
下一页