删除一次得到子数组最大和
前后缀分解,并且计算一个最大子段和。
对于下标为0
,和n-1
的情况,不用考虑,他们是连续的一段,他们的答案为suf[1]
和 pre[n-2]
,这些值已经是最大子段和的子集了
class Solution {
public:
int maximumSum(vector<int>& arr) {
int n = arr.size(),ans = INT_MIN;
vector<int> pre(n + 1),suf(n + 2);
for(int i = 0; i < n; i ++)
{
if(i == 0)pre[i] = arr[i];
else pre[i] = max(pre[i-1] + arr[i], arr[i]);
ans = max(pre[i],ans);
}
for(int i = n - 1; i >= 0; i --)
{
if(i == n - 1)suf[i] = arr[i];
else suf[i] = max(suf[i + 1] + arr[i], arr[i]);
}
for(int i = 1; i < n - 1; i ++)
{
ans = max(ans, pre[i - 1] + suf[i + 1]);
}
return ans;
}
};