📌  相关文章
📜  删除最多一个子数组后可能的最大子数组和(1)

📅  最后修改于: 2023-12-03 15:07:15.503000             🧑  作者: Mango

删除最多一个子数组后可能的最大子数组和

问题描述

给定一个含有n个整数的数组,你最多只能删除一个子数组,计算可以得到的最大和。

解法

我们需要考虑到最多只能删除一个子数组的情况,那么这个子数组可以是什么呢?假设数组的和为S,要使得删除一个子数组后可以得到最大和,那么这个子数组一定是S的一部分。

具体而言,设左端点为l,右端点为r。则以l为左端点的最大子数组和为L[l] = max(0, L[l-1]) + nums[l],以r为右端点的最大子数组和为R[r] = max(0, R[r+1]) + nums[r]。我们只需要枚举可能删除的子数组的左端点l和右端点r,从而得到不删除子数组时的最大和S,以及删除l+1, r后的最大和S1,以及删除[l, r-1]后的最大和S2,结果就是max(S, S1, S2)。

需要注意的是,当l=0或r=n-1时需要特判,因为此时L[l]或R[r]不存在。

下面是常规情况的代码片段:

class Solution:
    def maximumSum(self, arr: List[int]) -> int:
        n = len(arr)
        L, R = [arr[0]], [arr[-1]]
        for i in range(1, n):
            L.append(max(0, L[-1]) + arr[i])
        for i in reversed(range(n-1)):
            R.insert(0, max(0, R[0]) + arr[i])
        result = max(arr)
        for i in range(n):
            result = max(result, arr[i], L[i], R[i])
            if i == 0:
                result = max(result, R[i+1] + arr[i])
            elif i == n-1:
                result = max(result, L[i-1] + arr[i])
            else:
                result = max(result, L[i-1] + R[i+1])
        return result
复杂度分析

时间复杂度:O(n),其中n为数组长度。需要遍历数组计算L和R数组,之后需要再遍历一次数组计算最大值。

空间复杂度:O(n),保存L和R数组,以及常数级别的额外空间。