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”是一样的吧,换一个思路。

posted @ 2019-09-09 09:39  于老师的父亲王老爷子  阅读(17)  评论(0)    收藏  举报