📌  相关文章
📜  通过删除结束元素来最大化数组的总和(1)

📅  最后修改于: 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
复杂度分析
  • 时间复杂度:O(n),其中 n 是数组的长度。为了计算 leftSum 和 rightSum,数组 nums 中的每个元素都会被遍历一次。在计算删除不同结束元素时的总和时,数组 nums 中的每个元素都会被遍历一次。
  • 空间复杂度:O(n),其中 n 是数组的长度。我们需要用 O(n) 的空间记录 leftSum 和 rightSum。
参考链接