【发布时间】:2021-09-28 12:16:04
【问题描述】:
我正在尝试解决algorithm problem:
给定一个正整数数组
nums,如果该子数组中不同整数的数量正好是k,则调用nums的(连续的,不一定不同的)子数组“好”。例如,[1,2,3,1,2]具有3不同的整数:1、2和3。返回nums的好子数组个数。
查看here的解决方案,我想出了以下滑动窗口的方法:
class Solution {
public:
int helper(vector<int>& nums, int B) {
unordered_map<int, int> m;
int start=0, end=0, count=0;
while(end<nums.size()) {
m[nums[end]]++;
while(m.size()>B) {
m[nums[start]]--;
if(m[nums[start]]<=0) m.erase(nums[start]);
start++;
}
count+=(end-start+1);
end++;
}
return count;
}
int subarraysWithKDistinct(vector<int>& nums, int k) {
return helper(nums, k)-helper(nums, k-1);
}
};
我了解 helper() 函数的工作原理,但不了解使用 atmost k 和 k-1 不同整数计算子数组数量并减去它们背后的直觉(即,在helper(nums, k)-helper(nums, k-1) 后面)获取具有完全等于k 个不同整数的子数组的数量。
我缺少什么理解?
【问题讨论】:
-
我found 最接近的事情是声明:“一般来说,滑动窗口问题有某种聚合,最多 k,最大子串,最小子串与 k 等。他们总是“给定一个数组或字符串,找到一些计算的子问题“值。”
标签: c++ algorithm sliding-window sub-array