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

举报
悲恋花丶无心之人 发表于 2021/02/09 23:52:49 2021/02/09
【摘要】 目录 一、题目内容 二、解题思路 三、代码 一、题目内容 给定一个正整数数组 A,如果 A 的某个子数组中不同整数的个数恰好为 K,则称 A 的这个连续、不一定独立的子数组为好子数组。 (例如,[1,2,3,1,2] 中有 3 个不同的整数:1,2,以及 3。) 返回 A 中好子数组的数目。 示例 1: 输入:A = [1,2,1,2...

目录

一、题目内容

二、解题思路

三、代码


一、题目内容

给定一个正整数数组 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].

示例 2:

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

提示:

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

二、解题思路

最多存在 K 个不同整数的子区间的个数恰好存在K个不同整数的子区间的个数恰好等于最多存在 K - 1个不同整数的子区间的个数

因此,最多存在 K 个不同整数的子区间的个数 - 最多存在 K - 1个不同整数的子区间的个数恰好存在K个不同整数的子区间的个数

三、代码


  
  1. class Solution:
  2. def subarraysWithKDistinct(self, A: list, K: int) -> int:
  3. return self._subarrayWithDistinct(A, K) - self._subarrayWithDistinct(A, K - 1)
  4. # 计算最多为K的子数组长度
  5. def _subarrayWithDistinct(self, A, K):
  6. freq_num = [0 for _ in range(len(A) + 1)]
  7. left, right = 0, 0
  8. count = 0
  9. res = 0
  10. while right < len(A):
  11. if freq_num[A[right]] == 0:
  12. count += 1
  13. freq_num[A[right]] += 1
  14. right += 1
  15. while count > K:
  16. freq_num[A[left]] -= 1
  17. if freq_num[A[left]] == 0:
  18. count -= 1
  19. left += 1
  20. # 长度贡献
  21. res += right - left
  22. return res
  23. if __name__ == '__main__':
  24. s = Solution()
  25. A = [1, 2, 1, 2, 3]
  26. K = 2
  27. ans = s.subarraysWithKDistinct(A, K)
  28. print(ans)

文章来源: nickhuang1996.blog.csdn.net,作者:悲恋花丶无心之人,版权归原作者所有,如需转载,请联系作者。

原文链接:nickhuang1996.blog.csdn.net/article/details/113766832

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。