类型四:长度不固定的滑动窗口,求最小问题

124 阅读1分钟

一、滑动窗口

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

二、思路

  • 关键词:
    • 子串/子数组必定连续,且单调性(即同为正数)
    • 包含最小字眼
  • 难点在于:
    • 选择if还是for
    • 使用right-left+1更新最小值

三、题目汇总

四、题解汇总

  • Code 76
func minWindow(s string, t string) string {
    target:=map[byte]int{}
    for i:=0;i<len(t);i++{
        target[t[i]]++
    }
    windows:=map[byte]int{}
    left:=0
    res:=""
    minValue := math.MaxInt32
    for right:=0;right<len(s);right++{
        windows[s[right]]++
        for checkWindowHelper(windows,target) && left<=right{
            if right-left+1< minValue{
                minValue=right-left+1
                res=s[left:right+1]
            }
            windows[s[left]]--
            left++
        }
    }
    return res
}

func checkWindowHelper(windows map[byte]int, target map[byte]int)bool{
    for k,v:=range target{
        if windows[k]<v{
            return false
        }
    }
    return true
}
  • Code 209
func minSubArrayLen(target int, nums []int) int {
    sum:=0
    minValue:=math.MaxInt32
    left:=0
    sum=0
    for right:=0;right<len(nums);right++{
        sum=sum+nums[right]
        for sum>=target{
            sum=sum-nums[left]
            minValue=min(minValue,right-left+1)
            left++
        }
    }
    if minValue==math.MaxInt32{
        return 0
    }
    return minValue
}


func min(a,b int)int{
    if a<b{
        return a
    }
    return b
}