448最大连续子数组和问题
题解
问题描述
给定一个整数数组,允许最多进行一次修改,将任意一个元素修改为任意给定的值 x。求经过修改后,能够得到的连续子数组的最大和。
解题思路
一个比较经典的动态规划,需要注意的是题目要求的是必须恰好修改一次。
特殊情况处理:
- 当数组长度为 1 时,返回
x。 - 如果数组中所有元素都小于等于 0,返回数组中最大的元素和
x中的较大者。
- 当数组长度为 1 时,返回
前缀和计算:
- 使用后缀数组
suf,其中suf[i]表示从第i个元素开始的最大子数组和。 - 从数组末尾向前遍历,更新
suf[i]为suf[i+1] + a[i-1]和0的较大值。
- 使用后缀数组
遍历数组并计算结果:
- 使用变量
f来记录当前的最大子数组和。 - 对于每个位置
i,计算将a[i-1]修改为x后的最大子数组和,更新结果res。 - 更新
f为f + a[i-1]和0的较大值,以便下一次迭代使用。
- 使用变量
代码解析
1 | |
复杂度分析
- 时间复杂度:O(n),其中 n 是数组的长度。需要两次遍历数组。
- 空间复杂度:O(n),用于存储后缀数组
suf。
448最大连续子数组和问题
https://kongshuilinhua.github.io/2025/01/27/448最大连续子数组和问题/