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

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

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

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

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

示例 1:

**输入:**nums = [2,6,7,3,1,7], m = 3, k = 4
**输出:**18
**解释:**总共有 3 个长度为 k = 4 的几乎唯一子数组。分别为 [2, 6, 7, 3] ,[6, 7, 3, 1] 和 [7, 3, 1, 7] 。这些子数组中,和最大的是 [2, 6, 7, 3] ,和为 18 。

示例 2:

**输入:**nums = [5,9,9,2,4,5,4], m = 1, k = 3
**输出:**23
**解释:**总共有 5 个长度为 k = 3 的几乎唯一子数组。分别为 [5, 9, 9] ,[9, 9, 2] ,[9, 2, 4] ,[2, 4, 5] 和 [4, 5, 4] 。这些子数组中,和最大的是 [5, 9, 9] ,和为 23 。

示例 3:

**输入:**nums = [1,2,1,2,1,2,1], m = 3, k = 3
**输出:**0
**解释:**输入数组中不存在长度为 k = 3 的子数组含有至少 m = 3 个互不相同元素的子数组。所以不存在几乎唯一子数组,最大和为 0 。

提示:


  1. 入:下标为$i$的元素进入窗口,若$i<k-1$,重复第一步;
  2. 以数组元素为下标,使该下标对应哈希表的值+1。检查哈希表元素个数是否大于等于m。若是则更新最大和;
  3. 出,下标为$i-k+1$的元素离开窗口。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
class Solution {

public:

    long long maxSum(vector<int>& nums, int m, int k) {

        int i=0;

        long long max_sum=0,sum=0;

        unordered_map<int,int> cnt;

        for(i;i<nums.size();i++)

        {

            sum+=nums[i];

            cnt[nums[i]] ++;

            if(i<k-1) continue;

            if(cnt.size()>=m)

            {

                max_sum = max(max_sum,sum);

            }

            int out = nums[i-k+1];

            sum-=out;

            if( --cnt[out] == 0) cnt.erase(out);

        }

        return max_sum;

    }

};

上次更新 2025-04-04