获得徽章 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),并记录最大值。展开评论点赞 - #刷题交流# 最小代价问题
初始化:
使用哈希表记录每个元素的出现次数。
使用优先队列(最小堆)存储需要处理的元素及其对应的代价。
处理重复元素:
遍历数组 a,将重复的元素及其代价加入优先队列。
从优先队列中取出代价最小的元素,增加其值直到不再重复,并更新总代价。
更新和检查:
每次增加元素后,更新哈希表和优先队列。
继续处理直到所有元素都各不相同。展开评论点赞 - #刷题交流# 二进制状态变化的终极步骤
初始化:创建一个长度为 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 即为分到糖果最少的小朋友能得到的最大糖果数。展开评论点赞 - #刷题交流# 最小字符串价值问题
初始价值计算:首先,计算字符串的初始价值。这可以通过遍历字符串并统计相邻相同字符的数量来实现。
修改策略:为了最小化字符串的价值,我们需要考虑如何通过 k 次修改来减少相邻相同字符的数量。关键在于找到那些相邻的相同字符对,并尝试通过修改其中一个字符来打破这种相邻关系。
优先级:在选择修改位置时,优先考虑那些能够最大程度减少相邻相同字符对的位置。例如,如果有多个相邻的相同字符对,优先修改那些能够打破更多相邻对的位置。
边界情况:考虑 k 次修改是否足够打破所有相邻的相同字符对。如果 k 次修改后仍然有相邻的相同字符对,那么字符串的价值将取决于剩余的相邻对数量。展开评论点赞 - #刷题交流# 最大化数组
初始化操作次数:我们需要一个变量来记录最少的操作次数,初始值设为0。
比较与操作:
我们需要不断比较数组的第一个元素和其他元素,直到第一个元素成为最大值。
如果第一个元素不是最大值,我们可以选择对第一个元素进行操作(乘以2),或者对其他元素进行操作(除以2并向下取整),以减少第一个元素与其他元素的差距。
选择最优操作:
每次操作时,我们需要选择能使第一个元素更快成为最大值的操作。
具体来说,如果第一个元素小于某个元素,我们可以选择将第一个元素乘以2,或者将该元素除以2并向下取整。
更新操作次数:每次进行操作后,更新操作次数。
循环直到满足条件:重复上述步骤,直到第一个元素成为最大值。展开评论点赞 - #刷题交流# 字符替换与最长子串问题
初始化 left 和 right 指针为 0。
遍历字符串,移动 right 指针,扩展窗口。
更新字典 count,记录当前窗口中每个字符的出现次数。
如果窗口中不同字符的数量超过 2,移动 left 指针,缩小窗口,直到窗口中不同字符的数量不超过 2。
在每次扩展窗口时,更新 max_len,记录当前窗口的长度。展开评论点赞 - #刷题交流# 翻转增益的最大子数组和
计算原始数组的最大子数组和:
使用 Kadane 算法计算原始数组的最大子数组和。
计算翻转后的最大子数组和:
对于每个可能的翻转子数组,计算翻转后的数组,并使用 Kadane 算法计算其最大子数组和。
比较并选择最大值:
比较原始数组的最大子数组和与所有翻转后的最大子数组和,选择最大值作为最终答案。展开评论点赞 - #刷题交流# 子序列计数问题
初始化两个指针 left 和 right 都指向数组的起始位置。
移动 right 指针,扩大窗口,直到窗口内的最大值和最小值之差超过 k。
当窗口内的最大值和最小值之差超过 k 时,移动 left 指针,缩小窗口,直到窗口内的最大值和最小值之差再次满足条件。
每次移动 right 指针时,计算当前窗口内的子序列数量,并累加到结果中。展开评论点赞 - #刷题交流# 摇骰子胜率
初始化计数器:
使用两个嵌套循环来枚举小U和小S的所有可能得分。
使用一个计数器来记录小U得分大于小S得分的情况。
计算得分:
对于每个骰子,计算所有可能的得分。
使用递归或动态规划来计算所有可能的得分组合。
计算概率:
计算小U得分大于小S得分的组合数。
计算总的组合数。
用小U得分大于小S得分的组合数除以总的组合数,得到小U获胜的概率。展开评论点赞