码迷,mamicode.com
首页 > 编程语言 > 详细

<leetcode c++> 992. K 个不同整数的子数组

时间:2021-02-10 12:52:11      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:leetcode   res   tor   translate   --   public   com   problem   示例   

992. K 个不同整数的子数组

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

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

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

 

示例 1:

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

示例 2:

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

 

提示:

  1. 1 <= A.length <= 20000
  2. 1 <= A[i] <= A.length
  3. 1 <= K <= A.length

 这道题目乍一看很容易想到滑动窗口的方法, 但是实际上手后发现对于每一次右指针移动,左指针也需要相应的移动,实际造成了O(n^2)的时间复杂度。

 需要一个小技巧,把恰好变成最多。

 

技术图片

 

 

对于最多包含的问题,用活动窗口即有O(n)的解法。

class Solution {
public:
    int subarraysWithKDistinct(vector<int>& A, int K) {
        return func(A, K) - func(A, K - 1);
    }
    int func(vector<int>& A, int K){
        int ans = 0;
        int count = 0;
        int n = A.size();
        vector<int> vis(n + 1, 0);
        int l = 0;
        for(int r = 0; r < n; r++){
            if(vis[A[r]] == 0){
                ++count;
            }
            ++vis[A[r]];
            if(count > K){
                while(count > K){
                    vis[A[l]]--;
                    if(vis[A[l]] == 0)--count;
                    l++;
                }
            }
            ans += r - l + 1;
        }
        return ans;
    }
};

 

<leetcode c++> 992. K 个不同整数的子数组

标签:leetcode   res   tor   translate   --   public   com   problem   示例   

原文地址:https://www.cnblogs.com/Dancing-Fairy/p/14392354.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!