public int SubarraysWithKDistinct(int[] A, int K)
        {
            /*
             * 题目概述:子数组范围内有 K 个元素的个数
             *
             * 思路:
             *  1.最开始想的是固定左边界,找到所有的有边界,这样的话,需要校验的内容有点儿多
             *  2.逆向思维,固定有边界,找所有的左边界,这个是比较顺的,3 个指针都可以朝着一个方向依次移动
             *  3.维护一个窗口类,里面记录了元素的种类和个数
             *
             * 关键点:
             *
             * 时间复杂度:O(n)
             * 空间复杂度:O(n)
             */

            var forReturn = 0;

            var leftMinIndex = 0;
            var win1         = new Window();
            var leftMaxIndex = 0;
            var win2         = new Window();

            for (int rightIndex = 0; rightIndex < A.Length; rightIndex++)
            {
                win1.AddData(A[rightIndex]);
                win2.AddData(A[rightIndex]);

                while (win1.ElementCount() > K)
                {
                    win1.DelData(A[leftMinIndex++]);
                }
                while (win2.ElementCount() >= K)
                {
                    win2.DelData(A[leftMaxIndex++]);
                }

                if (win1.ElementCount() == K)
                {
                    forReturn += leftMaxIndex - leftMinIndex;
                }
            }

            return(forReturn);
        }