Skip to content

3487.删除后的最大子数组元素和

https://leetcode.cn/problems/maximum-unique-subarray-sum-after-deletion/

给你一个整数数组 nums

你可以从数组 nums 中删除任意数量的元素,但不能将其变为 数组。执行删除操作后,选出 nums 中满足下述条件的一个子数组:

  1. 子数组中的所有元素 互不相同
  2. 最大化 子数组的元素和。

返回子数组的 最大元素和

子数组 是数组的一个连续、非空 的元素序列。

示例 1:

输入:nums = [1,2,3,4,5]

输出:15

解释:

不删除任何元素,选中整个数组得到最大元素和。

示例 2:

输入:nums = [1,1,0,1,1]

输出:1

解释:

删除元素 nums[0] == 1nums[1] == 1nums[2] == 0nums[3] == 1 。选中整个数组 [1] 得到最大元素和。

示例 3:

输入:nums = [1,2,-1,-2,1,0,-1]

输出:3

解释:

删除元素 nums[2] == -1nums[3] == -2 ,从 [1, 2, 1, 0, -1] 中选中子数组 [2, 1] 以获得最大元素和。

提示:

  • 1 <= nums.length <= 100
  • -100 <= nums[i] <= 100
python
from typing import List

class Solution:
    def maxSum(self, nums: List[int]) -> int:
        # 筛选正数(删除重复只保留一个即可)
        pos = {x for x in nums if x > 0}
        if pos:
            # 如果有正数,选取所有正数(每个数只保留一次)的和最大
            return sum(pos)
        # 如果没有正数但存在 0,0 的和不会降低,所以答案为 0
        if 0 in nums:
            return 0
        # 如果全部为负数,必须选一个,所以选最大的(即负值中最大的那一个)
        return max(nums)
python
from typing import List

class Solution:
    def maxSum(self, nums: List[int]) -> int:
        ans = nums[0]
        visited = set()
        visited.add(nums[0])
        for num in nums[1:]:
            if num < 0 and num > ans:
                ans = num
                visited = set()
                visited.add(num)
                continue
            if num not in visited and num>=0:
                visited.add(num)
                ans = max(num, ans + num)

        return ans

if __name__ == "__main__":
    sol = Solution()
    print(sol.maxSum([1,2,3,4,5])) # 15
    print(sol.maxSum([1,1,0,1,1])) # 11
    print(sol.maxSum([-17,-15]))