获得徽章 0
#刷题交流# 最大乘积问题
初始化:
创建两个数组 L 和 R,分别用于存储每个元素的 L(i) 和 R(i)。
初始化 L 和 R 为全 0。
**计算 L(i)**:
使用一个栈来辅助计算。从左到右遍历数组:
如果栈不为空且栈顶元素对应的数组值大于当前元素,则弹出栈顶元素。
如果栈为空,则 L(i)=0。
否则,L(i) 为栈顶元素的索引。
将当前元素的索引压入栈中。
**计算 R(i)**:
使用一个栈来辅助计算。从右到左遍历数组:
如果栈不为空且栈顶元素对应的数组值大于当前元素,则弹出栈顶元素。
如果栈为空,则 R(i)=0。
否则,R(i) 为栈顶元素的索引。
将当前元素的索引压入栈中。
**计算 MAX(i)**:
遍历数组,计算 MAX(i)=L(i)∗R(i),并记录最大值。
初始化:
创建两个数组 L 和 R,分别用于存储每个元素的 L(i) 和 R(i)。
初始化 L 和 R 为全 0。
**计算 L(i)**:
使用一个栈来辅助计算。从左到右遍历数组:
如果栈不为空且栈顶元素对应的数组值大于当前元素,则弹出栈顶元素。
如果栈为空,则 L(i)=0。
否则,L(i) 为栈顶元素的索引。
将当前元素的索引压入栈中。
**计算 R(i)**:
使用一个栈来辅助计算。从右到左遍历数组:
如果栈不为空且栈顶元素对应的数组值大于当前元素,则弹出栈顶元素。
如果栈为空,则 R(i)=0。
否则,R(i) 为栈顶元素的索引。
将当前元素的索引压入栈中。
**计算 MAX(i)**:
遍历数组,计算 MAX(i)=L(i)∗R(i),并记录最大值。
展开
评论
点赞
#刷题交流# 最小代价问题
初始化:
使用哈希表记录每个元素的出现次数。
使用优先队列(最小堆)存储需要处理的元素及其对应的代价。
处理重复元素:
遍历数组 a,将重复的元素及其代价加入优先队列。
从优先队列中取出代价最小的元素,增加其值直到不再重复,并更新总代价。
更新和检查:
每次增加元素后,更新哈希表和优先队列。
继续处理直到所有元素都各不相同。
初始化:
使用哈希表记录每个元素的出现次数。
使用优先队列(最小堆)存储需要处理的元素及其对应的代价。
处理重复元素:
遍历数组 a,将重复的元素及其代价加入优先队列。
从优先队列中取出代价最小的元素,增加其值直到不再重复,并更新总代价。
更新和检查:
每次增加元素后,更新哈希表和优先队列。
继续处理直到所有元素都各不相同。
展开
评论
点赞
#刷题交流# 二进制状态变化的终极步骤
初始化:创建一个长度为 n 的列表 binary_string,初始值全为 0。
**遍历数组 arr**:
对于每个 arr[i],将 binary_string 中的第 arr[i] 位设置为 1。
使用滑动窗口检查当前的 binary_string 是否存在长度为 m 的连续 1 的子串。
如果存在,记录当前的步骤编号 i。
返回结果:如果在某一步中形成了长度为 m 的连续 1 的子串,返回该步骤的编号;否则,返回 -1。
初始化:创建一个长度为 n 的列表 binary_string,初始值全为 0。
**遍历数组 arr**:
对于每个 arr[i],将 binary_string 中的第 arr[i] 位设置为 1。
使用滑动窗口检查当前的 binary_string 是否存在长度为 m 的连续 1 的子串。
如果存在,记录当前的步骤编号 i。
返回结果:如果在某一步中形成了长度为 m 的连续 1 的子串,返回该步骤的编号;否则,返回 -1。
展开
评论
点赞
#刷题交流# 糖果均匀分配问题
初始化二分查找范围:
最小值 left 为 1(因为每个小朋友至少要得到一个糖果)。
最大值 right 为 min(a, b)(因为每种糖果最多只能分给一个小朋友)。
二分查找:
在 left 和 right 之间进行二分查找,每次计算 mid。
检查是否可以将糖果分配给 n 个小朋友,使得每个小朋友至少得到 mid 个糖果。
如果可以分配,则尝试更大的 mid(即 left = mid + 1)。
如果不能分配,则尝试更小的 mid(即 right = mid - 1)。
返回结果:
最终的 right 即为分到糖果最少的小朋友能得到的最大糖果数。
初始化二分查找范围:
最小值 left 为 1(因为每个小朋友至少要得到一个糖果)。
最大值 right 为 min(a, b)(因为每种糖果最多只能分给一个小朋友)。
二分查找:
在 left 和 right 之间进行二分查找,每次计算 mid。
检查是否可以将糖果分配给 n 个小朋友,使得每个小朋友至少得到 mid 个糖果。
如果可以分配,则尝试更大的 mid(即 left = mid + 1)。
如果不能分配,则尝试更小的 mid(即 right = mid - 1)。
返回结果:
最终的 right 即为分到糖果最少的小朋友能得到的最大糖果数。
展开
评论
点赞
#刷题交流# 最小字符串价值问题
初始价值计算:首先,计算字符串的初始价值。这可以通过遍历字符串并统计相邻相同字符的数量来实现。
修改策略:为了最小化字符串的价值,我们需要考虑如何通过 k 次修改来减少相邻相同字符的数量。关键在于找到那些相邻的相同字符对,并尝试通过修改其中一个字符来打破这种相邻关系。
优先级:在选择修改位置时,优先考虑那些能够最大程度减少相邻相同字符对的位置。例如,如果有多个相邻的相同字符对,优先修改那些能够打破更多相邻对的位置。
边界情况:考虑 k 次修改是否足够打破所有相邻的相同字符对。如果 k 次修改后仍然有相邻的相同字符对,那么字符串的价值将取决于剩余的相邻对数量。
初始价值计算:首先,计算字符串的初始价值。这可以通过遍历字符串并统计相邻相同字符的数量来实现。
修改策略:为了最小化字符串的价值,我们需要考虑如何通过 k 次修改来减少相邻相同字符的数量。关键在于找到那些相邻的相同字符对,并尝试通过修改其中一个字符来打破这种相邻关系。
优先级:在选择修改位置时,优先考虑那些能够最大程度减少相邻相同字符对的位置。例如,如果有多个相邻的相同字符对,优先修改那些能够打破更多相邻对的位置。
边界情况:考虑 k 次修改是否足够打破所有相邻的相同字符对。如果 k 次修改后仍然有相邻的相同字符对,那么字符串的价值将取决于剩余的相邻对数量。
展开
评论
点赞
#刷题交流# 最大化数组
初始化操作次数:我们需要一个变量来记录最少的操作次数,初始值设为0。
比较与操作:
我们需要不断比较数组的第一个元素和其他元素,直到第一个元素成为最大值。
如果第一个元素不是最大值,我们可以选择对第一个元素进行操作(乘以2),或者对其他元素进行操作(除以2并向下取整),以减少第一个元素与其他元素的差距。
选择最优操作:
每次操作时,我们需要选择能使第一个元素更快成为最大值的操作。
具体来说,如果第一个元素小于某个元素,我们可以选择将第一个元素乘以2,或者将该元素除以2并向下取整。
更新操作次数:每次进行操作后,更新操作次数。
循环直到满足条件:重复上述步骤,直到第一个元素成为最大值。
初始化操作次数:我们需要一个变量来记录最少的操作次数,初始值设为0。
比较与操作:
我们需要不断比较数组的第一个元素和其他元素,直到第一个元素成为最大值。
如果第一个元素不是最大值,我们可以选择对第一个元素进行操作(乘以2),或者对其他元素进行操作(除以2并向下取整),以减少第一个元素与其他元素的差距。
选择最优操作:
每次操作时,我们需要选择能使第一个元素更快成为最大值的操作。
具体来说,如果第一个元素小于某个元素,我们可以选择将第一个元素乘以2,或者将该元素除以2并向下取整。
更新操作次数:每次进行操作后,更新操作次数。
循环直到满足条件:重复上述步骤,直到第一个元素成为最大值。
展开
评论
点赞
#刷题交流# 字符替换与最长子串问题
初始化 left 和 right 指针为 0。
遍历字符串,移动 right 指针,扩展窗口。
更新字典 count,记录当前窗口中每个字符的出现次数。
如果窗口中不同字符的数量超过 2,移动 left 指针,缩小窗口,直到窗口中不同字符的数量不超过 2。
在每次扩展窗口时,更新 max_len,记录当前窗口的长度。
初始化 left 和 right 指针为 0。
遍历字符串,移动 right 指针,扩展窗口。
更新字典 count,记录当前窗口中每个字符的出现次数。
如果窗口中不同字符的数量超过 2,移动 left 指针,缩小窗口,直到窗口中不同字符的数量不超过 2。
在每次扩展窗口时,更新 max_len,记录当前窗口的长度。
展开
评论
点赞
#刷题交流# 翻转增益的最大子数组和
计算原始数组的最大子数组和:
使用 Kadane 算法计算原始数组的最大子数组和。
计算翻转后的最大子数组和:
对于每个可能的翻转子数组,计算翻转后的数组,并使用 Kadane 算法计算其最大子数组和。
比较并选择最大值:
比较原始数组的最大子数组和与所有翻转后的最大子数组和,选择最大值作为最终答案。
计算原始数组的最大子数组和:
使用 Kadane 算法计算原始数组的最大子数组和。
计算翻转后的最大子数组和:
对于每个可能的翻转子数组,计算翻转后的数组,并使用 Kadane 算法计算其最大子数组和。
比较并选择最大值:
比较原始数组的最大子数组和与所有翻转后的最大子数组和,选择最大值作为最终答案。
展开
评论
点赞
#刷题交流# 子序列计数问题
初始化两个指针 left 和 right 都指向数组的起始位置。
移动 right 指针,扩大窗口,直到窗口内的最大值和最小值之差超过 k。
当窗口内的最大值和最小值之差超过 k 时,移动 left 指针,缩小窗口,直到窗口内的最大值和最小值之差再次满足条件。
每次移动 right 指针时,计算当前窗口内的子序列数量,并累加到结果中。
初始化两个指针 left 和 right 都指向数组的起始位置。
移动 right 指针,扩大窗口,直到窗口内的最大值和最小值之差超过 k。
当窗口内的最大值和最小值之差超过 k 时,移动 left 指针,缩小窗口,直到窗口内的最大值和最小值之差再次满足条件。
每次移动 right 指针时,计算当前窗口内的子序列数量,并累加到结果中。
展开
评论
点赞
#刷题交流# 摇骰子胜率
初始化计数器:
使用两个嵌套循环来枚举小U和小S的所有可能得分。
使用一个计数器来记录小U得分大于小S得分的情况。
计算得分:
对于每个骰子,计算所有可能的得分。
使用递归或动态规划来计算所有可能的得分组合。
计算概率:
计算小U得分大于小S得分的组合数。
计算总的组合数。
用小U得分大于小S得分的组合数除以总的组合数,得到小U获胜的概率。
初始化计数器:
使用两个嵌套循环来枚举小U和小S的所有可能得分。
使用一个计数器来记录小U得分大于小S得分的情况。
计算得分:
对于每个骰子,计算所有可能的得分。
使用递归或动态规划来计算所有可能的得分组合。
计算概率:
计算小U得分大于小S得分的组合数。
计算总的组合数。
用小U得分大于小S得分的组合数除以总的组合数,得到小U获胜的概率。
展开
评论
点赞
#刷题交流# 简单四则运算解析器
初始化两个栈:一个用于操作数,一个用于运算符。
遍历表达式字符串:
如果遇到数字,将其解析为整数并压入操作数栈。
如果遇到运算符或括号:
如果运算符栈为空或栈顶是左括号(,直接将运算符压入栈。
如果当前运算符的优先级高于栈顶运算符,直接压入栈。
否则,弹出栈顶运算符并进行计算,直到满足上述条件。
如果遇到左括号(,直接压入运算符栈。
如果遇到右括号),弹出运算符栈中的运算符并进行计算,直到遇到左括号(。
处理剩余的运算符:遍历结束后,如果运算符栈中还有运算符,依次弹出并进行计算。
返回操作数栈中的唯一元素,即为表达式的结果。
初始化两个栈:一个用于操作数,一个用于运算符。
遍历表达式字符串:
如果遇到数字,将其解析为整数并压入操作数栈。
如果遇到运算符或括号:
如果运算符栈为空或栈顶是左括号(,直接将运算符压入栈。
如果当前运算符的优先级高于栈顶运算符,直接压入栈。
否则,弹出栈顶运算符并进行计算,直到满足上述条件。
如果遇到左括号(,直接压入运算符栈。
如果遇到右括号),弹出运算符栈中的运算符并进行计算,直到遇到左括号(。
处理剩余的运算符:遍历结束后,如果运算符栈中还有运算符,依次弹出并进行计算。
返回操作数栈中的唯一元素,即为表达式的结果。
展开
评论
1
#刷题交流# 二叉树供暖问题
排序:对 sums 进行排序。
初始化:假设最小的数为 x,那么 x 和 x 的和一定是最小的和。
递归推导:从最小的和开始,逐步推导出其他数。
验证:验证推导出的数是否满足所有和的条件。
排序:对 sums 进行排序。
初始化:假设最小的数为 x,那么 x 和 x 的和一定是最小的和。
递归推导:从最小的和开始,逐步推导出其他数。
验证:验证推导出的数是否满足所有和的条件。
展开
评论
1
#刷题交流# 字母串构造挑战
初始化:创建一个空列表 result 来存储最终的字符串。
贪心策略:为了使字符串字典序最大,我们应尽可能多地使用 'b',然后再使用 'a'。
循环构造:
尝试在当前位置添加 k 个 'b',如果剩余的 'b' 数量足够且不会导致连续 'b' 超过 k 个。
如果不能添加 k 个 'b',则添加剩余的 'b' 数量。
类似地,尝试添加 k 个 'a',如果剩余的 'a' 数量足够且不会导致连续 'a' 超过 k 个。
如果不能添加 k 个 'a',则添加剩余的 'a' 数量。
检查可行性:如果在构造过程中发现无法继续添加字符(即剩余的字符无法满足连续不超过 k 个的条件),则返回 -1。
转换结果:将列表 result 转换为字符串并返回。
初始化:创建一个空列表 result 来存储最终的字符串。
贪心策略:为了使字符串字典序最大,我们应尽可能多地使用 'b',然后再使用 'a'。
循环构造:
尝试在当前位置添加 k 个 'b',如果剩余的 'b' 数量足够且不会导致连续 'b' 超过 k 个。
如果不能添加 k 个 'b',则添加剩余的 'b' 数量。
类似地,尝试添加 k 个 'a',如果剩余的 'a' 数量足够且不会导致连续 'a' 超过 k 个。
如果不能添加 k 个 'a',则添加剩余的 'a' 数量。
检查可行性:如果在构造过程中发现无法继续添加字符(即剩余的字符无法满足连续不超过 k 个的条件),则返回 -1。
转换结果:将列表 result 转换为字符串并返回。
展开
评论
点赞
#刷题交流# 叠盘子排序
初始化:
使用一个指针 i 来遍历数组。
初始化一个空列表 result 来存储最终的结果。
遍历数组:
对于每个元素,检查它是否与前一个元素连续。
如果连续,继续检查下一个元素。
如果不连续,判断当前分组的长度:
如果长度大于等于3,将分组添加到 result 中。
如果长度小于3,将每个单独的元素添加到 result 中。
处理最后一个分组:
遍历结束后,检查最后一个分组的长度,并将其添加到 result 中。
格式化输出:
将 result 中的分组格式化为字符串,并返回。
初始化:
使用一个指针 i 来遍历数组。
初始化一个空列表 result 来存储最终的结果。
遍历数组:
对于每个元素,检查它是否与前一个元素连续。
如果连续,继续检查下一个元素。
如果不连续,判断当前分组的长度:
如果长度大于等于3,将分组添加到 result 中。
如果长度小于3,将每个单独的元素添加到 result 中。
处理最后一个分组:
遍历结束后,检查最后一个分组的长度,并将其添加到 result 中。
格式化输出:
将 result 中的分组格式化为字符串,并返回。
展开
评论
点赞
#刷题交流# 好排列的数量计算
计算奇数和偶数的数量:
如果 n 是偶数,奇数和偶数的数量各为 n/2。
如果 n 是奇数,奇数的数量为 (n//2) + 1,偶数的数量为 n//2。
排列组合:
计算所有可能的排列组合,确保没有两个相邻的奇数。
取模运算:
在每一步计算中,对结果取模 10^9 + 7。
计算奇数和偶数的数量:
如果 n 是偶数,奇数和偶数的数量各为 n/2。
如果 n 是奇数,奇数的数量为 (n//2) + 1,偶数的数量为 n//2。
排列组合:
计算所有可能的排列组合,确保没有两个相邻的奇数。
取模运算:
在每一步计算中,对结果取模 10^9 + 7。
展开
评论
1
#刷题交流# 数组最小化问题
初始化优先队列:将数组中的所有元素加入优先队列,优先队列会自动维护最大值在队列的顶部。
执行操作:
从优先队列中取出最大值。
将该值减少 x。
将减少后的值重新放回优先队列。
重复上述步骤,直到达到 k 次操作。
返回结果:操作完成后,优先队列中的最大值即为所求。
初始化优先队列:将数组中的所有元素加入优先队列,优先队列会自动维护最大值在队列的顶部。
执行操作:
从优先队列中取出最大值。
将该值减少 x。
将减少后的值重新放回优先队列。
重复上述步骤,直到达到 k 次操作。
返回结果:操作完成后,优先队列中的最大值即为所求。
展开
评论
1
#刷题交流# 数组跳跃的最小部署问题
初始化:创建一个队列,用于存储当前位置和步数。初始时,将起始位置和步数(0)加入队列。
BFS遍历:
从队列中取出一个位置和步数。
如果该位置已经是数组的最后一个成员,返回当前步数。
否则,根据当前位置的值计算下一步可以跳跃的位置,并将这些位置和步数+1加入队列。
边界条件:如果队列为空且没有到达最后一个成员,返回 -1。
初始化:创建一个队列,用于存储当前位置和步数。初始时,将起始位置和步数(0)加入队列。
BFS遍历:
从队列中取出一个位置和步数。
如果该位置已经是数组的最后一个成员,返回当前步数。
否则,根据当前位置的值计算下一步可以跳跃的位置,并将这些位置和步数+1加入队列。
边界条件:如果队列为空且没有到达最后一个成员,返回 -1。
展开
1
点赞
#刷题交流# 非素数和排列问题
生成素数集合:
使用埃拉托斯特尼筛法生成所有小于 2n 的素数。因为排列中最大的两个相邻元素之和为 2n-1,所以我们只需要生成小于 2n 的素数。
生成排列:
使用回溯法生成所有可能的排列。
在生成排列的过程中,检查当前排列的最后一个元素与下一个候选元素的和是否为素数。如果是素数,则跳过该候选元素。
统计有效排列:
每生成一个满足条件的排列,计数器加1。
生成素数集合:
使用埃拉托斯特尼筛法生成所有小于 2n 的素数。因为排列中最大的两个相邻元素之和为 2n-1,所以我们只需要生成小于 2n 的素数。
生成排列:
使用回溯法生成所有可能的排列。
在生成排列的过程中,检查当前排列的最后一个元素与下一个候选元素的和是否为素数。如果是素数,则跳过该候选元素。
统计有效排列:
每生成一个满足条件的排列,计数器加1。
展开
评论
2
#刷题交流# 题目: 最小替换子串长度
算法步骤:
初始化计数器:统计字符串中每个字符的出现次数。
计算目标频次:由于字符串长度是4的倍数,每个字符的目标频次应该是 len(input) // 4。
计算需要替换的字符数:对于每个字符,如果它的出现次数超过了目标频次,计算需要替换的字符数。
滑动窗口:使用滑动窗口来找到最小的子串,使得替换操作最少。
算法步骤:
初始化计数器:统计字符串中每个字符的出现次数。
计算目标频次:由于字符串长度是4的倍数,每个字符的目标频次应该是 len(input) // 4。
计算需要替换的字符数:对于每个字符,如果它的出现次数超过了目标频次,计算需要替换的字符数。
滑动窗口:使用滑动窗口来找到最小的子串,使得替换操作最少。
展开
评论
点赞