用滑块窗口解决长度最小的子数组。

一、题目:

给定一个含有 n 个正整数的数组和一个正整数 target 。

找出该数组中满足其和≥target 的长度最小的连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回0 。

二、暴力解法:

        用两个for循环,一个控制起始位置,一个控制终止位置,在区间内搜索,最后枚举出区间来比长短。

三、滑动窗口(类似双指针)

        定义个起始位置和终止位置,先移动终止位置,当起始位置和终止位置之间数据的和大于target,那么记录数据并让起始位置向前移动一个位置。

四、解题思路:

        设置一个初始指针,设置一个sum来记录初始位置和结束位置之间的数的和,设置一个结果来与下文中的chang比较,并作为返回值返回,这个长要设置为最大值,即数组长度+1。

         当初始位置和结束位置之间的数的和大于等于要找的数时,设置一个长来记录初始位置到结束位置之间的长度,判断结束之后让初始指针向前移动,向前移动之后sum应该减去初始指针移动前所处位置的值。

         

        最后用条件运算符来判断,如果如果不存在符合条件的子数组,返回0,如果存在符合条件的子数组返回res。

五、完整代码:

import java.util.Arrays;

public class Solution {
    public static int minSubArrayLen(int target, int[] nums) {
        //设置一个初始指针
        int begin = 0;

        //设置一个sum来记录初始位置和结束位置之间的数的和
        int sum = 0;

        //设置一个结果来与下文中的chang比较,并作为返回值返回,这个长要设置为最大值,即数组长度+1
        int res = nums.length + 1;

        for (int end = 0;end < nums.length;end++){
            sum += nums[end];

            //当初始位置和结束位置之间的数的和大于等于要找的数时
            while(sum >= target){
                //设置一个长来记录初始位置到结束位置之间的长度
                int chang = end - begin + 1;
                if (chang < res){
                    res = chang;
                }
                //判断结束之后让初始指针向前移动
                //向前移动之后sum应该减去初始指针移动前所处位置的值
                sum = sum - nums[begin];
                begin++;
            }
        }

        //最后用条件运算符来判断,如果如果不存在符合条件的子数组,返回0,如果存在符合条件的子数组返回res
        return (res != (nums.length + 1)) ? res : 0;
    }

    public static void main(String[] args) {
        int target = 7;
        System.out.println("target = " + target);
        int[] nums = {2, 3, 1, 2, 4, 3};
        System.out.println("nums = " + Arrays.toString(nums));

        System.out.println(minSubArrayLen(target, nums));
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值