1 条题解
-
0
好的,这是该题的题解和算法标签。
题目翻译
给定一个长度为 的自然数数组,将其划分为两个非空连续子数组,使得两个子数组的和的乘积最大。输出划分位置 (即第一个子数组的最后一个元素下标)。
题解
算法思路
设数组总和为 ,前缀和 ,则切分在位置 时:
- 左部分和 =
- 右部分和 =
- 乘积
展开: [ P(i) = S \cdot pre[i] - pre[i]^2 ] 这是关于 的二次函数,开口向下,对称轴在 。
因此,当 最接近 时,乘积最大。
我们只需遍历 ,找到使 最小的 即可。
时间复杂度
- 计算前缀和:
- 遍历寻找最优位置: 总复杂度 ,可处理 。
空间复杂度
- 只需维护前缀和与总和, 额外空间(不存整个前缀和数组也可)。
示例
输入:
3 1 2 3总和 ,。
- :,差
- :,差
选 ,输出
2。
算法标签
- 前缀和
- 数学优化
- 贪心
- 数组
核心结论
最大乘积出现在前缀和最接近总和一半的位置。
- 1
信息
- ID
- 4326
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者