七七老师の白日梦
首页项目归档照片墙音乐灵境说说杂谈友链关于
封面

几乎唯一子数组的最大和:滑动窗口

写作时间:2026-08-23 09:29:54

题目

给你一个整数数组 nums 和两个正整数 m 和 k 。

请你返回 nums 中长度为 k 的 几乎唯一 子数组的 最大和 ,如果不存在几乎唯一子数组,请你返回 0 。

如果 nums 的一个子数组有至少 m 个互不相同的元素,我们称它是 几乎唯一 子数组。

子数组指的是一个数组中一段连续 非空 的元素序列

链接

2841. 几乎唯一子数组的最大和

代码

import java.util.HashMap;
import java.util.List;
import java.util.Map;

class Solution {
    public long maxSum(List<Integer> nums, int m, int k) {
        Map<Integer,Integer> map = new HashMap<>();

        int different = 0;
        long windowSum = 0;
        long ansSum = 0;

        for (int i = 0;i < k;i++) {
            int val = nums.get(i);
            windowSum += val;
            int old = map.getOrDefault(val,0);
            if (old == 0)
                different++;
            map.put(val,old + 1);
        }

        if (different >= m)
            ansSum = windowSum;

        for (int i = k;i < nums.size();i++) {
            int removeval = nums.get(i - k);
            windowSum -= removeval;
            int removecnt = map.get(removeval);
            removecnt--;
            if (removecnt == 0) {
                different--;
            }
            map.put(removeval,removecnt);

            int addval = nums.get(i);
            windowSum += addval;
            int addcnt = map.getOrDefault(addval,0);
            if (addcnt == 0)
                different++;
            map.put(addval,addcnt + 1);

            if (different >= m) {
                if (windowSum > ansSum)
                    ansSum = windowSum;
            }
        }
        return ansSum;
    }
}

纯手敲代码~

avatar

七七老师

分享代码日常

RECOMMENDED

七七旧事:复盘并改变写博客的方式

2026-07-02 22:54:38

字母异位词

2026-07-04 22:22:08

寻找两个正序数组的中位数:合并与二分

2026-07-08 15:56:26

Table of Contents