类型三:长度不固定的滑动窗口,求恰好问题

78 阅读1分钟

一、滑动窗口

  • 本质:固定左端点,不断枚举右端点,  不满足条件时缩短左端点
  • 题目条件:满足 单调性(数组元素都是正数)  的 子数组(数组元素连续)

二、思路

  • 关键词:

    • 子串/子数组必定连续,且单调性(即同为正数)
    • 包含恰好字眼
  • 难点在于:

    • 求恰好 ,这种情况下需要把「求恰好」 转换成为 「求最多」。 具体思路为:例如求恰好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
}