获得徽章 0
#刷题交流# 序列划分与最大化函数值
预处理:首先,我们可以预处理出每个子序列的 unique 操作后的长度。这可以通过遍历序列并记录每个连续相同元素的段来实现。
动态规划:
定义 dp[i][j] 表示将前 i 个元素划分为 j 段时,所能得到的最大 f 函数值之和。
初始化:dp[0][0] = 0,表示没有元素时,划分 0 段的最大值为 0。
状态转移:对于每个 i 和 j,我们可以尝试将前 i 个元素划分为 j 段,考虑最后一个段的起点 l,则有:
plaintext
其中 unique_length(l, i) 表示从 l 到 i 的子序列经过 unique 操作后的长度。
结果:最终答案为 dp[n][k],即前 n 个元素划分为 k 段时的最大 f 函数值之和。
展开
评论
#刷题交流# 固定差值序列查找
初始化:创建一个空字典 dp,用于存储每个元素作为子序列结尾时的最长子序列长度。
遍历数组:对于数组中的每个元素 arr[i],计算其前一个可能的元素 arr[i] - d。
更新字典:
如果 arr[i] - d 存在于字典中,说明可以形成一个以 arr[i] 结尾的子序列,其长度为 dp[arr[i] - d] + 1。
如果 arr[i] - d 不存在于字典中,说明 arr[i] 是子序列的第一个元素,其长度为 1。
记录最大长度:在遍历过程中,记录并更新最长子序列的长度
展开
评论
#刷题交流# 快乐时间最大化
对书籍评分列表 books 进行降序排序。
初始化一个变量 total_happiness 用于累加快乐时间。
遍历排序后的书籍列表,计算每本书的快乐时间系数并累加到 total_happiness 中。
返回 total_happiness。
展开
评论
#刷题交流# 数值组合筛选问题
暴力解法:

使用两层循环遍历所有数对 (i, j)。
计算 nums[i] XOR nums[j]。
检查结果是否在 [low, high] 范围内。
统计满足条件的数对数量。
前缀树解法:

构建一个前缀树,将数组中的每个元素插入到前缀树中。
对于每个元素,在前缀树中查找与其异或结果在 [low, high] 范围内的元素。
统计满足条件的数对数量。
排序 + 双指针解法:

对数组进行排序。
使用双指针遍历数组,寻找满足条件的数对。
统计满足条件的数对数量。
展开
评论
#刷题交流# 最小数组极值
排序数组:对数组进行排序,这样可以更容易地找到最大值和最小值。
遍历所有可能的组合:遍历数组中所有可能的两两组合,计算它们的和,并将其放回数组。
计算新的极值:对于每一种组合,计算操作后的数组极值,并更新最小极值。
展开
评论
#刷题交流# 字母出现次数统计
初始化字典:创建一个空字典来存储每个字母的出现次数。
遍历字符串:遍历字符串 s 中的每个字符,更新字典中对应字母的计数。
统计符合条件的字母:遍历字典,统计出现次数大于等于 k 的字母个数。
展开
评论
#刷题交流# 最大优美排列
初始化排列:从 n 到 1 的顺序构造排列。
验证排列:检查构造的排列是否满足 a[a[i]] = n - a[i] + 1 的条件。
评论
#刷题交流# 多任务下载器问题
创建事件列表:

对于每个任务,创建两个事件:一个表示任务的开始,另一个表示任务的结束。
事件的格式可以是 (时间点, 事件类型),其中事件类型可以是 +1 表示开始,-1 表示结束。
排序事件列表:

按照时间点对事件列表进行排序。如果时间点相同,先处理结束事件再处理开始事件(这样可以避免重复计算)。
扫描事件列表:

初始化一个计数器 current_tasks 表示当前正在进行的任务数。
遍历排序后的事件列表,根据事件类型更新 current_tasks。
在遍历过程中,记录 current_tasks 的最大值,这个最大值就是任务的最高并发数。
展开
评论
#刷题交流# 兔群繁殖问题
初始化:创建一个数组 rabbit_pairs,其中 rabbit_pairs[0] 表示第1个月末的兔子对数,初始值为1。
递推计算:从第2个月开始,每个月的兔子对数等于前两个月的兔子对数之和。
返回结果:最终返回第 A 个月末的兔子对数。
展开
评论
#刷题交流# 报警问题分类
初始化:

读取用户命中实验列表。
读取查询条件。
处理每个查询:

对于每个查询,提取命中和未命中的实验。
遍历每个用户,检查是否符合查询条件。
统计符合条件的用户数量。
返回结果:

将每次查询的结果存储在列表中并返回。
展开
评论
#刷题交流# 数列差异的最小化
公式简化:首先,我们可以将公式 ∣(a[i]−b[j])2−k2∣ 进行简化。注意到 (a[i]−b[j])2−k2 可以分解为 (a[i]−b[j]−k)(a[i]−b[j]+k)。因此,我们需要找到使得 ∣(a[i]−b[j]−k)(a[i]−b[j]+k)∣ 最小的 a[i] 和 b[j]。
排序:为了高效地找到最小的差值,我们可以先对数列 a 和 b 进行排序。排序后,我们可以使用双指针技术来遍历数列 a 和 b,从而找到最小的差值。
双指针技术:
初始化两个指针 i 和 j,分别指向数列 a 和 b 的起始位置。
计算当前指针位置的差值 ∣(a[i]−b[j])2−k2∣。
根据差值的大小,移动指针 i 或 j,以期望找到更小的差值。
展开
评论
#刷题交流# 叠盘子排序
初始化:创建一个空列表 result 来存储最终的结果。
遍历数组:使用一个循环遍历数组 plates。
检查连续性:在遍历过程中,检查当前盘子是否与前一个盘子连续。
形成堆:如果连续,继续检查下一个盘子,直到不再连续或数组结束。
判断堆的大小:如果形成的堆大小至少为3,则将其格式化为 start-end 的形式;否则,单独列出每个盘子。
拼接结果:将所有形成的堆和单独列出的盘子拼接成一个字符串。
展开
评论
#刷题交流# 字符串最短循环子串
初始化两个指针 left 和 right 都指向字符串的起始位置。
遍历字符串,尝试扩展 right 指针,直到窗口内的修复操作次数超过 m。
当修复操作次数超过 m 时,移动 left 指针,缩小窗口,直到修复操作次数再次小于等于 m。
在每次扩展 right 指针时,记录当前窗口的长度,并更新最大长度。
展开
评论
#刷题交流# 字符串最短循环子串
遍历可能的子串长度:从1到字符串长度的一半(因为子串长度至少要是原字符串长度的一半才能重复构成原字符串)。
检查每个子串:对于每个可能的子串长度,提取该长度的子串,并检查它是否可以重复构成原字符串。
判断重复性:通过将子串重复若干次,判断是否等于原字符串。
返回结果:如果找到符合条件的子串,返回该子串;否则,返回空字符串
展开
评论
#刷题交流# 数字增值问题
初始化:从初始序列 [1, 2, ..., n] 开始。
增殖操作:对于每次增殖操作,计算新的序列长度,并判断是否需要继续增殖。
查找位置:在最终的序列中查找第 p 个位置的数字。
评论
#刷题交流# 倒排索引
初始化指针:分别在 a 和 b 的开头设置两个指针 i 和 j。
遍历数组:
如果 a[i] 等于 b[j],则将该元素加入结果集,并同时移动两个指针。
如果 a[i] 小于 b[j],则移动 i 指针。
如果 a[i] 大于 b[j],则移动 j 指针。
结果排序:由于我们需要结果按从大到小的顺序,可以在最后对结果集进行排序。
展开
评论
#刷题交流# 组装电脑问题
计算所有可能的售价:对于每个外壳售价 a_i 和每个零件售价 b_j,计算它们的和 a_i + b_j。
统计每个售价的出现次数:使用哈希表记录每个售价的出现次数。
找出出现次数最多的售价:遍历哈希表,找出出现次数最多的售价,这个次数就是最多可以组装的电脑数量。
展开
评论
#刷题交流# Base32 编码和解码问题
编码:
将输入字符串转换为二进制数据。
补 0 使 bit 数目为 5 的倍数。
按 5 bit 分组,转换为索引,再转换为字符。
根据余数补 +。

解码:
将编码字符串转换为二进制数据。
去除末尾的 +。
按 8 bit 分组,转换为字符。
展开
评论
#刷题交流# 递归是一种在函数中调用自身的编程技术,用于解决具有重复结构的问题。它通过将问题分解为更小的子问题来实现,直到达到基本情况停止递归。
评论
#刷题交流# 题:石子移动问题
思路:
排序:首先对石子位置进行排序,以便更容易找到端点石子。
计算初始端点石子:找到初始的端点石子数量。
模拟移动:模拟移动过程,每次移动一个端点石子到一个未占用的位置,直到石子位置变得连续。
计算移动次数:记录每次移动的次数,直到无法再移动为止。
展开
评论
下一页