【LeetCode-992】K 个不同整数的子数组

问题

给定一个正整数数组 A,如果 A 的某个子数组中不同整数的个数恰好为 K,则称 A 的这个连续、不一定不同的子数组为好子数组。

(例如,[1,2,3,1,2] 中有 3 个不同的整数:1,2,以及 3。)

返回 A 中好子数组的数目。

提示:

  • 1 <= A.length <= 20000
  • 1 <= A[i] <= A.length
  • 1 <= K <= A.length

示例

输入: A = [1,2,1,3,4], K = 3
输出: 3
解释: 恰好由 3 个不同整数组成的子数组:[1,2,1,3], [2,1,3], [1,3,4].

解答

class Solution {
public:
    int subarraysWithKDistinct(vector<int>& nums, int k) {
        return atMost(nums, k) - atMost(nums, k - 1);
    }
private:
    int atMost(vector<int>& nums, int k) {
        int res = 0, n = nums.size(), l = 0, r = 0;
        int memo[n + 1]; bzero(memo, sizeof memo);
        while (r < n) {
            if (memo[nums[r++]]++ == 0) k--;
            while (k < 0)
                if (memo[nums[l++]]-- == 1) k++;
            res += r - l;
        }
        return res;
    }
};

重点思路

本题需要求解所有包含k种不同数字的子数组。转换为atMost问题,则答案为“至少包含k种数字的数组数量”减去“至少包含k - 1种数字的数组数量”。

posted @ 2021-08-16 00:07  tmpUser  阅读(29)  评论(0编辑  收藏  举报