Welcome to Subscribe On Youtube
3487. Maximum Unique Subarray Sum After Deletion
Description
You are given an integer array nums
.
You are allowed to delete any number of elements from nums
without making it empty. After performing the deletions, select a subarray of nums
such that:
- All elements in the subarray are unique.
- The sum of the elements in the subarray is maximized.
Return the maximum sum of such a subarray.
Example 1:
Input: nums = [1,2,3,4,5]
Output: 15
Explanation:
Select the entire array without deleting any element to obtain the maximum sum.
Example 2:
Input: nums = [1,1,0,1,1]
Output: 1
Explanation:
Delete the element nums[0] == 1
, nums[1] == 1
, nums[2] == 0
, and nums[3] == 1
. Select the entire array [1]
to obtain the maximum sum.
Example 3:
Input: nums = [1,2,-1,-2,1,0,-1]
Output: 3
Explanation:
Delete the elements nums[2] == -1
and nums[3] == -2
, and select the subarray [2, 1]
from [1, 2, 1, 0, -1]
to obtain the maximum sum.
Constraints:
1 <= nums.length <= 100
-100 <= nums[i] <= 100
Solutions
Solution 1: Greedy + Hash Table
We first find the maximum value $\textit{mx}$ in the array. If $\textit{mx} \leq 0$, then all elements in the array are less than or equal to 0. Since we need to select a non-empty subarray with the maximum element sum, the maximum element sum would be $\textit{mx}$.
If $\textit{mx} > 0$, then we need to find all distinct positive integers in the array such that their sum is maximized. We can use a hash table $\textit{s}$ to record all distinct positive integers, and then iterate through the array, adding up all distinct positive integers.
The time complexity is $O(n)$, and the space complexity is $O(n)$. Where $n$ is the length of the array $\textit{nums}$.
-
class Solution { public int maxSum(int[] nums) { int mx = Arrays.stream(nums).max().getAsInt(); if (mx <= 0) { return mx; } boolean[] s = new boolean[201]; int ans = 0; for (int x : nums) { if (x < 0 || s[x]) { continue; } ans += x; s[x] = true; } return ans; } }
-
class Solution { public: int maxSum(vector<int>& nums) { int mx = ranges::max(nums); if (mx <= 0) { return mx; } unordered_set<int> s; int ans = 0; for (int x : nums) { if (x < 0 || s.contains(x)) { continue; } ans += x; s.insert(x); } return ans; } };
-
class Solution: def maxSum(self, nums: List[int]) -> int: mx = max(nums) if mx <= 0: return mx ans = 0 s = set() for x in nums: if x < 0 or x in s: continue ans += x s.add(x) return ans
-
func maxSum(nums []int) (ans int) { mx := slices.Max(nums) if mx <= 0 { return mx } s := make(map[int]bool) for _, x := range nums { if x < 0 || s[x] { continue } ans += x s[x] = true } return }
-
function maxSum(nums: number[]): number { const mx = Math.max(...nums); if (mx <= 0) { return mx; } const s = new Set<number>(); let ans: number = 0; for (const x of nums) { if (x < 0 || s.has(x)) { continue; } ans += x; s.add(x); } return ans; }