一、滑动窗口
- 本质:固定左端点,不断枚举右端点, 不满足条件时缩短左端点。
- 题目条件:满足 单调性(数组元素都是正数) 的 子数组(数组元素连续) 。
二、思路
-
关键词:
- 子串/子数组必定连续,且单调性(即同为正数)
- 包含恰好字眼
-
难点在于:
- 求恰好 ,这种情况下需要把「求恰好」 转换成为 「求最多」。 具体思路为:例如求恰好k个,就用最多k个 - 最多k−1个 = 恰好k个
-
难点在于:
- 使用if还是for
- 最值结果通常是right-left+1来更新
- 统计数目使用map
二、题目汇总
三、题解汇总
- Code 992
func subarraysWithKDistinct(nums []int, k int) int {
return subarraysWithKDistinctHelper(nums,k)-subarraysWithKDistinctHelper(nums,k-1)
}
func subarraysWithKDistinctHelper(nums []int, k int)int{
windows :=map[int]int{}
left:=0
res:=0
for right:=0;right<len(nums);right++{
windows[nums[right]]++
for len(windows)>k{
windows[nums[left]]--
if windows[nums[left]]==0{
delete(windows,nums[left])
}
left++
}
res=res+right-left
}
return res
}