一、滑动窗口
- 本质:固定左端点,不断枚举右端点, 不满足条件时缩短左端点。
- 题目条件:满足 单调性(数组元素都是正数) 的 子数组(数组元素连续) 。
二、思路
- 关键词:
- 子串/子数组必定连续,且单调性(即同为正数)
- 包含最小字眼
- 难点在于:
- 选择if还是for
- 使用right-left+1更新最小值
三、题目汇总
四、题解汇总
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
}
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
}