欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 家装 > 【滑动窗口】个人练习-Leetcode-992. Subarrays with K Different Integers

【滑动窗口】个人练习-Leetcode-992. Subarrays with K Different Integers

2024/10/24 1:56:48 来源:https://blog.csdn.net/Rstln/article/details/140120587  浏览:    关键词:【滑动窗口】个人练习-Leetcode-992. Subarrays with K Different Integers

题目链接:https://leetcode.cn/problems/subarrays-with-k-different-integers/description/

题目大意:给一个数组nums[],求【不同元素刚好为k个】的子列的个数。子列要求连续。

思路:主要是转换题意,可以先求【不同元素最多为k个】的子列数,然后再求【不同元素最多为k-1个】的子列数,两者相减就是【不同元素刚好为k个】的子列数。思路有点像前缀和。

那么可以用滑动窗口来解决。对于每一个固定的右端点r,找一个左端点l(从最左边开始找)使得刚好[l, r]区间里的不同元素个数刚好为k(这样就是最多为k个的情况)。然后这个l可以作为下一轮的新起点,因为下一轮r往右移动了,使得不同元素数只会增加或者不变,l没必要再从0开始,只要从上一轮的l开始就行了。

每一轮中的r-l刚好就是【新增子列数】,因为新增子列是连续的,并且必然包含nums[r],这些子列即为以r为右端点,长度为1, 2, ..., r-l的子列。

完整代码

class Solution {
public:int kDis(vector<int>& nums, int k) {int n = nums.size();vector<int> freq(n+1, 0);int l = 0, r = 0, res = 0;int disn = 0;while (r < n) {if (freq[nums[r]] == 0)disn++;freq[nums[r]]++;r++;while (disn > k) {freq[nums[l]]--;if (freq[nums[l]] == 0)disn--;l++;}res += r - l;}return res;}int subarraysWithKDistinct(vector<int>& nums, int k) {return kDis(nums, k) - kDis(nums, k-1);}
};

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com