题目:

给你一个整数数组 nums 。

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

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

返回子数组的 最大元素和 。

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

示例 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

分析:

根据题意我们可以任意删除某个元素,使得剩下的元素之和最大; 为了使元素之和最大,我们可以贪心的选择所有正数,因为负数肯定会将元素之和变小,而0我们选不选都无所谓,其不会使元素之和变化; 这样就结束了吗?没有,因为题目要求不能使数组为空,如果所有元素都是负数,按上面流程操作就会使数组为空,为了满足这个条件,我们还是可以贪心的想,此时只需要输出一个最大值就是最终的结果。

AC代码:

class Solution {
public:int maxSum(vector<int>& nums) {int n = nums.size();unordered_set<int> st;int ans = 0, maxn = INT_MIN;for (int num : nums) {maxn = max(maxn, num);if (num <= 0) {continue;}if (st.count(num)) {continue;}ans += num;st.insert(num);}return ans == 0 ? maxn : ans;}
};