问题描述
小U在公司年会上运气极佳,赢得了一等奖。作为一等奖得主,他有机会在一排红包中做两次切割,将红包分成三部分,要求第一部分和第三部分的红包总金额相等。他可以获得的金额是第一部分红包的总金额。帮小U计算出他能从这些红包中拿到的最大奖金金额。
测试样例
样例1:
输入:
redpacks = [1, 3, 4, 6, 7, 14]
输出:14
样例2:
输入:
redpacks = [10000]
输出:0
样例3:
输入:
redpacks = [10, 10, 10, 10]
输出:20
样例4:
输入:
redpacks = [5, 5, 10, 20, 10, 5, 5]
输出:20
样例5:
输入:
redpacks = [7, 7, 7, 21, 7, 7]
输出:14
解决思路
-
前缀和计算:
- 首先,我们计算红包数组的前缀和。前缀和数组中的每个元素表示从红包数组的开始到当前位置的累计金额。
-
哈希表记录前缀和:
- 我们使用一个哈希表来存储每个前缀和及其对应的最早出现位置。这有助于我们在后续步骤中快速查找是否存在某个特定的前缀和。
-
双循环遍历切割点:
- 我们使用两个嵌套的循环来遍历所有可能的切割点。外层循环确定第一个切割点的位置,内层循环确定第二个切割点(即红包数组的末尾)的位置。
-
查找相等的两部分:
- 对于每一对切割点,我们检查是否存在一个前缀和,使得从第一个切割点到当前位置的前缀和减去某个之前的前缀和等于从数组开始到第一个切割点之前的前缀和。
- 这实际上是在检查是否存在一个位置,使得该位置之前的红包金额与从第一个切割点到第二个切割点之间的红包金额相等。
-
更新最大奖金:
- 如果找到了满足条件的前缀和,我们计算第一部分的金额(即目标值),并将其与当前的最大奖金进行比较,更新最大奖金。
-
返回结果:
- 遍历完成后,我们返回计算得到的最大奖金。
注意事项
- 如果红包数量少于3个,则无法进行切割,直接返回0。
- 在计算前缀和时,我们创建一个长度为
n+1的前缀和数组,其中prefix_sums[0]为0,方便计算。 - 在哈希表中,我们存储的是前缀和及其对应的最早出现位置,这有助于我们确定满足条件的第一部分红包的范围。
复杂度分析
- 时间复杂度:由于我们使用了两个嵌套的循环来遍历所有可能的切割点,时间复杂度为O(n^2)。
- 空间复杂度:我们使用了前缀和数组和哈希表来存储信息,空间复杂度为O(n)。
通过这种方法,我们可以有效地找到满足条件的最大奖金金额。