【算法题解】209. 长度最小的子数组 - Java -滑动窗口

1. 题目描述

给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。

输入:s = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。
2. 滑动窗口分析

通常滑动窗口是用来解决字符串的问题。子串问题

  1. 滑动窗口,类似一个窗口,窗口里面放的是符合题目要求的值。属于双指针的一种类型
  2. 设置两个指针leftright ,并初始化两个指针都为0,窗口win,[ left, right )
  3. 不断增加right即扩大窗口win [left, right)。直到窗口中的字符符合题目要求。
  4. 窗口符合要求后,不断增加left即缩小窗口,直到不符合要求。同时每次增加left,都要更新结果res
  5. 重复3、4直到right到达字符串的尾部。
3. JAVA代码
    public int minSubArrayLen(int s, int[] nums) {
        // // base case
        if(len == 0)        return 0;
        // 长度为1 
        if(len == 1)        return nums[0] == s ? 1 : 0;
        // 串的长度
        int len = nums.length;
        // 左指针
        int left = 0;
        // 右指针
        int right = 0;
        // 窗口
        int window = 0;
        // 返回结果
        int res = Integer.MAX_VALUE;
        // 移动指针,直到右指针到达串的末尾
        while(right < len)
        {
        	// 先移动右指针,扩大窗口,让窗口符合题目要求
            for(;right < len && window < s; right++) 
                window += nums[right];
          	// 移动左指针,缩小窗口,并更新返回值res
            while(window >= s) {	
            	// 更新返回值,区最小的值,
                res = Math.min(res, right - left);
                // 缩小窗口
                window -= nums[left];
                // 移动左指针
                left++;
            }
        }
        // 返回结果、并做个小判断判断是否空串
        return res == Integer.MAX_VALUE ? 0 : res;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值