classSolution { publiclongmaxSum(List<Integer> nums, int m, int k) { vara= nums.stream().mapToInt(i -> i).toArray(); longans=0, sum = 0; varcnt=newHashMap<Integer, Integer>(); for (inti=0; i < k - 1; i++) { // 先统计 k-1 个数 sum += a[i]; cnt.merge(a[i], 1, Integer::sum); // cnt[a[i]]++ } for (inti= k - 1; i < nums.size(); i++) { sum += a[i]; // 再添加一个数就是 k 个数了 cnt.merge(a[i], 1, Integer::sum); // cnt[a[i]]++ if (cnt.size() >= m) ans = Math.max(ans, sum);
intout= a[i - k + 1]; sum -= out; // 下一个子数组不包含 out,移出窗口 if (cnt.merge(out, -1, Integer::sum) == 0) // --cnt[out] == 0 cnt.remove(out); } return ans; } }
classSolution { public: longlongmaxSum(vector<int> &nums, int m, int k){ longlong ans = 0, sum = 0; unordered_map<int, int> cnt; for (int i = 0; i < k - 1; i++) { // 先统计 k-1 个数 sum += nums[i]; cnt[nums[i]]++; } for (int i = k - 1; i < nums.size(); i++) { sum += nums[i]; // 再添加一个数就是 k 个数了 cnt[nums[i]]++; if (cnt.size() >= m) ans = max(ans, sum);
int out = nums[i - k + 1]; sum -= out; // 下一个子数组不包含 out,移出窗口 if (--cnt[out] == 0) cnt.erase(out); } return ans; } };
funcmaxSum(nums []int, m, k int) (ans int64) { sum := int64(0) cnt := map[int]int{} for _, x := range nums[:k-1] { // 先统计 k-1 个数 sum += int64(x) cnt[x]++ } for i, in := range nums[k-1:] { sum += int64(in) // 再添加一个数就是 k 个数了 cnt[in]++ iflen(cnt) >= m && sum > ans { ans = sum }
out := nums[i] sum -= int64(out) // 下一个子数组不包含 out,移出窗口 cnt[out]-- if cnt[out] == 0 { delete(cnt, out) } } return }