3487.删除后的最大子数组元素和
https://leetcode.cn/problems/maximum-unique-subarray-sum-after-deletion/
给你一个整数数组 nums 。
你可以从数组 nums 中删除任意数量的元素,但不能将其变为 空 数组。执行删除操作后,选出 nums 中满足下述条件的一个子数组:
- 子数组中的所有元素 互不相同 。
- 最大化 子数组的元素和。
返回子数组的 最大元素和 。
子数组 是数组的一个连续、非空 的元素序列。
示例 1:
输入:nums = [1,2,3,4,5]
输出:15
解释:
不删除任何元素,选中整个数组得到最大元素和。
示例 2:
输入:nums = [1,1,0,1,1]
输出:1
解释:
删除元素 nums[0] == 1、nums[1] == 1、nums[2] == 0 和 nums[3] == 1 。选中整个数组 [1] 得到最大元素和。
示例 3:
输入:nums = [1,2,-1,-2,1,0,-1]
输出:3
解释:
删除元素 nums[2] == -1 和 nums[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]))