目标
给你一个整数数组 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
思路
有一个数组 nums
,允许删除其中任意元素得到一个 非空 数组,使得最终数组中 不包含重复元素 并且所有 元素和最大。
为了使和最大,我们应该删掉所有的负数,同时对剩余元素去重累加求和。需要注意如果数组中全是负数,需要保留最大元素。
代码
/**
* @date 2025-07-25 8:55
*/
public class MaxSum3487 {
public int maxSum(int[] nums) {
int sum = Arrays.stream(nums).distinct().filter(x -> x > 0).sum();
if (sum == 0){
OptionalInt max = Arrays.stream(nums).max();
return max.isPresent() ? max.getAsInt() : sum;
}
return sum;
}
}