LeetCode:1186. Maximum Subarray Sum with One Deletion

这题超有意思。
这题是周赛的一题,做的我快抑郁了,竟然没有做出来。
我的想法是这样的:第一反应是dp,一维二维的都试了,但是都不行,写不出来,状态和方程都不好写。其实这时候应该反应过来dp不行了。
后来看了评论区,才知道应该这么做:
考虑这道题:求出以每个位置为开始点和终点的最大连续子数组和。那么对于i,去掉nums[i]之后的最大连续子数组和是maxEndHere[i-1]+maxStartHere[i+1]。
真的,要看哭了,自己这么就想不出来?
class Solution {
public:
int maximumSum(vector<int>& arr) {
int sz = arr.size();
if (sz == 1)
return arr[0];
vector<int> maxEndHere(sz, 0);
maxEndHere[0] = arr[0];
int maxSum = arr[0];//连续的子数组和的最大值
for (int i = 1; i < sz; ++i) {
maxEndHere[i] = max(maxEndHere[i-1]+arr[i], arr[i]);
maxSum = max(maxSum, maxEndHere[i]);
}
vector<int> maxStartHere(sz, 0);
maxStartHere[sz-1] = arr[sz-1];
for (int i = sz-2; i >= 0; --i)
maxStartHere[i] = max(maxStartHere[i+1]+arr[i], arr[i]);
for (int i = 1; i < sz-1; ++i)//考虑了最两边的情况了
maxSum = max(maxEndHere[i-1] + maxStartHere[i+1], maxSum);
return maxSum;
}
};
另外,还有一个比较玄的想法:
之前想的(包括dp)都是确定一段范围之后考虑怎么删掉其中一个点使和最大。但是答案给的思路是从每个点出发,以它为基准,找到删掉它之后的最大和。
这应该和那种“从终点出发的bfs”是一样的吧,换一个思路。
浙公网安备 33010602011771号