【刷题笔记】数组 - 滑动窗口

最小滑窗模板: 在满足条件的情况下不断压缩左边界

for j < len(nums) {
	对nums[j]进行操作	
	for 满足条件 {
		更新结果
		i++
	}
	j++
}

example: 力扣209.长度最小的子数组

func minSubArrayLen(target int, nums []int) int {
    l, r := 0, 0
    sum := 0
    res := len(nums) + 1

    for r < len(nums) {
        sum += nums[r]
        for sum >= target {
            if res > r - l + 1 {
                res = r - l + 1
            }
            sum -= nums[l]
            l++
        }
        r++
    }
    if res == len(nums) + 1 {
        return 0
    }
    return res
}

最大滑窗模板 一旦满足条件,则扩展右边界

for j < len(nums) {
	对nums[j]进行操作
	for 不满足条件 {
		i++
	}
	更新结果
	j++
}

example: 力扣904.水果成篮

func totalFruit(fruits []int) int {
    i, j := 0, 0
    types := make(map[int]int)
    res := 0

    for ; j < len(fruits); j++ {
        types[fruits[j]]++
        for len(types) > 2 {
            types[fruits[i]]--
            if types[fruits[i]] == 0 {
                delete(types, fruits[i])
            }
            i++
        }
        if res < j - i + 1 {
            res = j - i + 1
        }
    }
    return res
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值