📅  最后修改于: 2023-12-03 15:12:23.885000             🧑  作者: Mango
给定一个整数数组 nums,一开始你可以从任意位置开始删除其中的一个元素(也可以不删),然后继续按照原来的顺序进行删除。假设你每次可以删除一个结束元素,直到数组为空。请你计算删除结束元素后,数组中剩余元素的和的最大值。
输入:nums = [4, 2, 3, 6, 8]
输出:25
解释:可以选择删除 4,3,8 这三个数字,剩余元素为 [2, 6],总和为 2 + 6 + 17 = 25。
这是一道比较有趣的贪心算法问题。我们可以从整个数组的开始和结尾分别计算出到当前位置的最大值。然后从第二个位置开始遍历整个数组,计算出将当前位置作为结束元素时的总和,并与前一个最大值进行比较,取较大值作为新的当前最大值。
在具体实现中,我们可以用一个数组 leftSum 来表示从左开始到当前位置的最大值,用一个数组 rightSum 来表示从右开始到当前位置的最大值。然后在第二个位置开始遍历时,计算出将当前位置作为结束元素时的总和,并用前一个最大值更新当前最大值。
实现代码如下:
def maximumSum(nums: List[int]) -> int:
n = len(nums)
leftSum, rightSum = [0]*n, [0]*n
# 初始化 leftSum 和 rightSum
leftSum[0], rightSum[-1] = nums[0], nums[-1]
for i in range(1, n):
leftSum[i] = max(leftSum[i-1]+nums[i], nums[i])
for i in range(n-2, -1, -1):
rightSum[i] = max(rightSum[i+1]+nums[i], nums[i])
# 计算删除不同结束元素时的总和
res = max(leftSum)
for i in range(1, n-1):
res = max(res, leftSum[i-1]+rightSum[i+1])
return res