题目:
给你一个整数数组 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;}
};