力扣209-长度最小的子数组(Java,双指针解法)

本文解析了如何使用双指针技巧解决LeetCode上的最小长度子数组和问题,通过控制快慢指针动态调整子数组范围,以找到满足目标和的最小子数组。关键在于维护总和sum和长度len的关系,避免排序,适用于随机数数组。
摘要由CSDN通过智能技术生成

 209. 长度最小的子数组 - 力扣(LeetCode) (leetcode-cn.com)icon-default.png?t=M3C8https://leetcode-cn.com/problems/minimum-size-subarray-sum/

 

 思路:

这个题不能先排序呀!数是随机的!

一开始拿到这个题想到的是能不能用动态规划做,看着有点眼熟。但是想了想发现我不会,二维数组能表示的量不够,所以把思路转到专门的数组问题上。而这个数组处理的手段首先想到双指针。(不知道用双指针属于单纯的知识漏洞,不是问题;知道用双指针,知道双指针的思路和写法,但是写不出来才是问题)

思路就是设立快慢指针,总和sum和长度len(由于题里给了数组的长度限制,所以len一开始可以初始化为一个具体的值,比数组长度大1,这样就解决[1,1],target=2的例子),快指针遍历数组,sum加上fast对应的每个元素,一旦sum>=target,那么说明当前:

1.至少找到一个符合要求的序列,比对len与当前长度fast-slow的长度,取最小值;

2.该序列可能不是最优解,需要再次判断。

此时为了看是不是还能有更小的len,在保证sum满足要求的情况下,快指针不动,向数组末尾移动慢指针,同时sum减去慢指针所指的值,一并更新len的长度。

这样下来最后len如果从未被改变过,说明没有符合要求的序列,输出0;否则输出len即是最小长度。

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int slow = 0,fast=slow;
        int len=100001,sum=0;
        while(fast<nums.length)
        {
            sum+=nums[fast];
            while(sum>=target)
            {
                len = Math.min(fast-slow,len);
                sum -= nums[slow];
                slow++;
            }
            fast++;
        }
        return len==100001?0:len+1;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值