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

(例如,[1,2,3,1,2] 中有 3 个不同的整数:1,2,以及 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].

解题思路

这题与普通滑动窗口的不同之处在于:要统计[l,r]区间内的满足不同整数的个数恰好为 K的子数组的个数,按照常规滑动窗口做法需要不断l++,直到不同整数的个数不为 K,但是这样的话,新得到的窗口就会丢失一部分元素,后面枚举r的时候,就会有遗漏。
因此这题不直接移动l,而是选择维护一个多重的滑动窗口,[l…l1…r]其中[l1,r]区间为满足不同整数的个数恰好为 K-1的区间,
设区间末尾都是r
因为[l1…r]是恰好只有k-1个不同整数的,所以起始位置在l1前面的子数组,区间内的不同整数的个数都大于k-1
因为[l…r]是恰好只有k个不同整数的,所以起始位置在l前面的子数组,区间内的不同整数的个数都大于k
综上所述,起始位置处于l和l1的子数组,区间内的不同整数的个数都刚好等于k
因此统计[l,r]区间内的满足不同整数的个数恰好为 K的子数组的个数,只需要计算l1-l即可。

代码

class Solution {public int subarraysWithKDistinct(int[] A, int K) {int n=A.length;int[] cnt1=new int[n+1],cnt2=new int[n+1];int n1=0,n2=0,l1=0,l2=0;int l=0,r=0,res=0;while (r<n){if(cnt1[A[r]]==0)n1++;cnt1[A[r]]++;if(cnt2[A[r]]==0)n2++;cnt2[A[r]]++;while (n2>K-1){cnt2[A[l2]]--;if(cnt2[A[l2]]==0)n2--;l2++;}while (n1>K){cnt1[A[l1]]--;if(cnt1[A[l1]]==0)n1--;l1++;}res+=l2-l1;r++;}return res;}
}

leetcode 992. K 个不同整数的子数组(滑动窗口)相关推荐

  1. LeetCode 992. K 个不同整数的子数组(双指针)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个正整数数组 A,如果 A 的某个子数组中不同整数的个数恰好为 K,则称 A 的这个连续.不一定独立的子数组为好子数组. (例如,[1,2,3,1, ...

  2. 【Leetcode数组--子数组--滑动窗口】209. 长度最小的子数组 904. 水果成篮 1004. 最大连续1的个数 III 76. 最小覆盖子串(有数组操作中重要的方法:滑动窗口!!!!)

    文章目录 Leetcode209 1.问题描述 2.解决方案 解法一:两个错误思路的算法 解法二:暴力 解法三:滑动窗口法(O(n)) Leetcode904 1.问题描述 2.解决方案 Leetco ...

  3. [Leedcode][JAVA][第209题][长度最小的子数组][滑动窗口][前缀和][二分查找][双指针]

    [问题描述][中等] 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组,并返回其长度.如果不存在符合条件的连续子数组,返回 0.示例: 输入: ...

  4. leet209. 长度最小的子数组 滑动窗口

    题目: 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度.如果不存在符合条件的子数组,返回 0. 示例: 输入:s = 7, ...

  5. LeetCode 209. 长度最小的子数组 (滑动窗口)

    LeetCode 209. 长度最小的子数组 class Solution {public int minSubArrayLen(int s, int[] nums) {int start = 0;i ...

  6. 长度最小的子数组--滑动窗口

    暴力法 两个for循环,然后不断的寻找符合条件的子序列,时间复杂度很明显是O(n^2) . 时间复杂度:O(n^2) 空间复杂度:O(1) class Solution {public:int min ...

  7. leetcode209. 长度最小的子数组(滑动窗口)

    一:题目 二:上码 class Solution {public:/**思路:1.滑动窗口解法1>:确定窗口内是什么2>:确定窗口的起始位置3>:确定窗口的终止位置2.窗口:也就是我 ...

  8. Leetcode滑窗系列(java):643. 子数组最大平均数 I

    Leetcode滑窗系列(java):643. 子数组最大平均数 I(新手小白仅供参考) 题目来源 leetcode 题目描述 个人思路 创建一个滑窗,将其值的和作为作为判断基准 然后滑窗的左右边界各 ...

  9. 【LeetCode】剑指 Offer 42. 连续子数组的最大和

    [LeetCode]剑指 Offer 42. 连续子数组的最大和 文章目录 [LeetCode]剑指 Offer 42. 连续子数组的最大和 一.动态规划 一.动态规划 状态定义 设动态规划列表 dp ...

最新文章

  1. [转](不理想)Ubuntu下更改主显示器
  2. asp.net 的状态管理
  3. NeHe教程Qt实现——lesson16
  4. rsync问题-connection refused(111)、Unknown module
  5. CFile和CStdioFile的区别以及‘\r’、‘\r\n’
  6. SharePoint 搜索功能失效
  7. hdfs/hbase报错:Incomplete HDFS URI, no host
  8. php 动态添加表格行,jQuery给html表格动态添加行方法总结
  9. linux ioctl及ioctl command
  10. 阿里云破世界记录,王坚说新登月计划需十年,我看不用!
  11. 祝贺吾博文中第一篇点击超过一万的文章出现
  12. 【21】基于java的旅游信息管理系统
  13. 正二十面体的各个面位置点
  14. [CGAL] CGAL各模块介绍
  15. 正弦交流电有效值系数sqrt(2)的推导
  16. HTML制作手风琴效果,纯js+html和纯css+html制作手风琴效果,css手风琴
  17. 计算机速录方法,速录练习技巧方法介绍
  18. PLsql(PLSQL Developer)安装与配置
  19. 照片、摄影处理中的基本知识
  20. 北京城市总体规划 (2016年—2035年)附图

热门文章

  1. Java高级开发面试,java字符串拼接的方法
  2. vue 双数据绑定原理
  3. ubuntu18.04安装chrome和优化界面
  4. Swift5.1 语言指南(九) 闭包
  5. 帆软报表和jeecg的进一步整合--ajax给后台传递map类型的参数
  6. lintcode433 岛屿的个数
  7. Js实现div随鼠标移动的方法
  8. 20155305乔磊2016-2017-2《Java程序设计》第四周学习总结
  9. Hive_Hive的数据模型_内部表
  10. 如何赛筛选出多列内容相同的数据??