LeetCode:1186. Maximum Subarray Sum with One Deletion

LeetCode:1186. Maximum Subarray Sum with One Deletion_第1张图片

这题超有意思。
这题是周赛的一题,做的我快抑郁了,竟然没有做出来。
我的想法是这样的:第一反应是dp,一维二维的都试了,但是都不行,写不出来,状态和方程都不好写。其实这时候应该反应过来dp不行了。
后来看了评论区,才知道应该这么做:
考虑这道题:求出以每个位置为开始点和终点的最大连续子数组和。那么对于i,去掉nums[i]之后的最大连续子数组和是maxEndHere[i-1]+maxStartHere[i+1]。
真的,要看哭了,自己这么就想不出来?

class Solution {
public:
    int maximumSum(vector& arr) {
        int sz = arr.size();
        if (sz == 1)
            return arr[0];
        vector 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 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”是一样的吧,换一个思路。

你可能感兴趣的:(Leetcode)