992. K 个不同整数的子数组
目录
- 一、题目
- 二、思路
- 2.1 解题思路
- 2.2 代码尝试
- 2.3 疑难问题
- 三、解法
- 四、收获
- 4.1 心得
- 4.2 举一反三
一、题目
二、思路
2.1 解题思路
2.2 代码尝试
class Solution {
public:
int subarraysWithKDistinct(vector<int>& nums, int k) {
//需要有数据结构来存储数组统计情况,还是采用哈希表
unordered_map<int,int> map;
int ret=0;
int l=0,r=0;
while(r<nums.size()){
//窗口先伸展到最大
map[nums[r]]++;
ret+=cnt?=r-l+1<k0:
while(map.size()>k){
if(map[nums[l]]!=0){
map[nums[l]]--;
}else{
map.erase[nums[l]];
}
l++;
}
}
return ret;
}
};
2.3 疑难问题
三、解法
class Solution {
public:
int subarraysWithKDistinct(vector<int>& nums, int k) {
int n = nums.size();
vector<int> num1(n + 1), num2(n + 1);
int tot1 = 0, tot2 = 0;
int left1 = 0, left2 = 0, right = 0;
int ret = 0;
while (right < n) {
if (!num1[nums[right]]) {
tot1++;
}
num1[nums[right]]++;
if (!num2[nums[right]]) {
tot2++;
}
num2[nums[right]]++;
while (tot1 > k) {
num1[nums[left1]]--;
if (!num1[nums[left1]]) {
tot1--;
}
left1++;
}
while (tot2 > k - 1) {
num2[nums[left2]]--;
if (!num2[nums[left2]]) {
tot2--;
}
left2++;
}
ret += left2 - left1;
right++;
}
return ret;
}
};
作者:力扣官方题解
链接:https://leetcode.cn/problems/subarrays-with-k-different-integers/solutions/598045/k-ge-bu-tong-zheng-shu-de-zi-shu-zu-by-l-9ylo/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
四、收获
4.1 心得
4.2 举一反三
count(k)-count(k-1)的思想