zoukankan      html  css  js  c++  java
  • <leetcode c++> 992. K 个不同整数的子数组

    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;
        }
    };
  • 相关阅读:
    数据库之01-数据库概述
    Bootstrap框架
    jQuery
    补充:html速查表
    BOM,DOM相关案例
    BOM,DOM
    函数,词法分析,内置对象和方法
    前端 之 JaveScript 基础语法: 数据类型; 运算符; 数据转换; 流程控制; 常用内置对象;
    favicon.ioc使用以及注意事项
    redux-undo
  • 原文地址:https://www.cnblogs.com/Dancing-Fairy/p/14392354.html
Copyright © 2011-2022 走看看