【leetcode学习记录】

本文介绍了滑动窗口算法在解决两类问题中的应用:寻找最小窗口和寻找最大窗口。对于最小窗口问题,通过左右指针动态调整窗口大小,保持窗口内的元素总和大于等于目标值,记录并更新最小窗口大小。在最大窗口问题中,当窗口内元素超过特定条件时,缩小窗口直至满足条件,同时更新最大窗口大小。这两个示例分别对应于LeetCode的209题和904题的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

滑动窗口

滑动窗口有两大类基本问题:

1.找最小窗口

基本思想:定义两个指针left和right,left指针控制开始位置,right指针控制结束位置,right指针不断向右移动直到窗口内满足条件,记录窗口大小之后left指针向右移动缩小窗口大小,每次缩小后判断是否依然满足条件,如果满足就更新窗口大小,直到不满足条件时right指针继续向右移动直到满足条件,以此类推找到符合条件的最小窗口。

//leetcode-209
class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int left = 0;
        int result = Integer.MAX_VALUE;
        int sum = 0;
        for(int right = 0; right < nums.length; right++){
            sum += nums[right];
            while(sum >= target){
                result = result < (right - left + 1) ? result : (right - left + 1);
                sum -= nums[left++];
            }
        }
        return result == Integer.MAX_VALUE ? 0 : result;
    }
}

2.找最大窗口

基本思想:定义两个指针left和right,left指针控制开始位置,right指针控制结束位置,right指针不断向右移动直到窗口内刚刚超出条件,之后left指针向右移动缩小窗口大小,每次缩小后判断是否满足条件,直到刚刚满足条件时right指针继续向右移动直到再次超出条件,right指针每次移动前都要更新窗口大小,以此类推找到符合条件的最大窗口大小。

//leetcode-904
class Solution {
    public int totalFruit(int[] fruits) {
        int left = 0;
        int num = 0;
        int count = 0;
        int []freq = new int[fruits.length];
        for(int right = 0; right < fruits.length; right++){
            //如果加入的是新的水果类别
            //将手中水果种类数量+1
            if(freq[fruits[right]] == 0){
                count++;
            }
            freq[fruits[right]]++;
            //当存到第三种水果时
            //一直减到只有二种水果在数组中
            while(count > 2){
                //减掉最早的一个水果树
                freq[fruits[left]]--;
                if(freq[fruits[left]] == 0){
                    count--;
                }
                left++;
            }
            num = (right - left + 1) > num ? (right - left + 1) : num;
        }
        return num;
    }
 }

未完待续。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值