Input: nums =[2,6,7,3,1,7], m =3, k =4Output: 18Explanation: There are 3 almost unique subarrays of size k =4. These subarrays are [2,6,7,3],[6,7,3,1], and [7,3,1,7]. Among these subarrays, the one with the maximum sum is[2,6,7,3] which has a sum of 18.
Input: nums =[5,9,9,2,4,5,4], m =1, k =3Output: 23Explanation: There are 5 almost unique subarrays of size k. These subarrays are [5,9,9],[9,9,2],[9,2,4],[2,4,5], and [4,5,4]. Among these subarrays, the one with the maximum sum is[5,9,9] which has a sum of 23.
Input: nums =[1,2,1,2,1,2,1], m =3, k =3Output: 0Explanation: There are no subarrays of size k =3 that contain at least m =3 distinct elements in the given array [1,2,1,2,1,2,1]. Therefore, no almost unique subarrays exist, and the maximum sum is0.
To find the maximum sum of a subarray of length k with at least m distinct elements, we can use a sliding window. By maintaining a count of each element in the window, we can efficiently check the number of distinct elements and update the sum as the window moves.
classSolution {
public:int maxSum(vector<int>& nums, int m, int k) {
unordered_map<int, int> cnt;
int sum =0, ans =0, n = nums.size();
for (int i =0; i < k; ++i) {
cnt[nums[i]]++;
sum += nums[i];
}
if (cnt.size() >= m) ans = sum;
for (int i = k; i < n; ++i) {
cnt[nums[i-k]]--;
if (cnt[nums[i-k]] ==0) cnt.erase(nums[i-k]);
sum -= nums[i-k];
cnt[nums[i]]++;
sum += nums[i];
if (cnt.size() >= m) ans = max(ans, sum);
}
return ans;
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
funcmaxSum(nums []int, m, kint) int {
cnt:=map[int]int{}
sum, ans:=0, 0fori:=0; i < k; i++ {
cnt[nums[i]]++sum+=nums[i]
}
if len(cnt) >=m { ans = sum }
fori:=k; i < len(nums); i++ {
cnt[nums[i-k]]--ifcnt[nums[i-k]] ==0 { delete(cnt, nums[i-k]) }
sum-=nums[i-k]
cnt[nums[i]]++sum+=nums[i]
if len(cnt) >=m&&sum > ans { ans = sum }
}
returnans}
classSolution {
publicintmaxSum(int[] nums, int m, int k) {
Map<Integer, Integer> cnt =new HashMap<>();
int sum = 0, ans = 0;
for (int i = 0; i < k; ++i) {
cnt.put(nums[i], cnt.getOrDefault(nums[i], 0) + 1);
sum += nums[i];
}
if (cnt.size() >= m) ans = sum;
for (int i = k; i < nums.length; ++i) {
cnt.put(nums[i-k], cnt.get(nums[i-k]) - 1);
if (cnt.get(nums[i-k]) == 0) cnt.remove(nums[i-k]);
sum -= nums[i-k];
cnt.put(nums[i], cnt.getOrDefault(nums[i], 0) + 1);
sum += nums[i];
if (cnt.size() >= m) ans = Math.max(ans, sum);
}
return ans;
}
}
classSolution {
funmaxSum(nums: IntArray, m: Int, k: Int): Int {
val cnt = mutableMapOf<Int, Int>()
var sum = 0var ans = 0for (i in0 until k) {
cnt[nums[i]] = cnt.getOrDefault(nums[i], 0) + 1 sum += nums[i]
}
if (cnt.size >= m) ans = sum
for (i in k until nums.size) {
cnt[nums[i-k]] = cnt[nums[i-k]]!! - 1if (cnt[nums[i-k]] ==0) cnt.remove(nums[i-k])
sum -= nums[i-k]
cnt[nums[i]] = cnt.getOrDefault(nums[i], 0) + 1 sum += nums[i]
if (cnt.size >= m) ans = maxOf(ans, sum)
}
return ans
}
}
defmax_sum(nums: list[int], m: int, k: int) -> int:
from collections import defaultdict
cnt: dict[int, int] = defaultdict(int)
sum_ =0 ans =0for i in range(k):
cnt[nums[i]] +=1 sum_ += nums[i]
if len(cnt) >= m:
ans = sum_
for i in range(k, len(nums)):
cnt[nums[i-k]] -=1if cnt[nums[i-k]] ==0:
del cnt[nums[i-k]]
sum_ -= nums[i-k]
cnt[nums[i]] +=1 sum_ += nums[i]
if len(cnt) >= m:
ans = max(ans, sum_)
return ans
impl Solution {
pubfnmax_sum(nums: Vec<i32>, m: i32, k: i32) -> i32 {
use std::collections::HashMap;
let (m, k) = (m asusize, k asusize);
letmut cnt = HashMap::new();
letmut sum =0;
letmut ans =0;
for i in0..k {
*cnt.entry(nums[i]).or_insert(0) +=1;
sum += nums[i];
}
if cnt.len() >= m { ans = sum; }
for i in k..nums.len() {
let out = nums[i-k];
let entry = cnt.get_mut(&out).unwrap();
*entry -=1;
if*entry ==0 { cnt.remove(&out); }
sum -= out;
*cnt.entry(nums[i]).or_insert(0) +=1;
sum += nums[i];
if cnt.len() >= m && sum > ans { ans = sum; }
}
ans
}
}