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

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

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

 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;
    }
}

 

### C语言实现力扣长度最小子数组问题 为了找到满足条件的最小子数组,可以采用滑动窗口的方法来解决这个问题。这种方法能够有效地减少不必要的重复计算。 #### 方法描述 通过维护一个动态调整大小的窗口,在遍历过程中不断更新这个窗口内的元素之和,并记录下当前已知的最短符合条件的子数组长度。当窗口内元素总和达到或超过目标值 `target` 时,尝试收缩左边界以寻找更小的可能解;反之则扩展右边界继续累加新加入的数值直到再次满足条件为止[^1]。 下面是具体的代码实现: ```c #include <stdio.h> #include <limits.h> // 定义函数用于查找最小长度连续子数组 int minSubArrayLen(int target, int* nums, int numsSize){ int sum = 0; int minLength = INT_MAX; // 初始化为最大整型数表示尚未发现有效解 int start = 0; for (int end = 0; end < numsSize; ++end) { sum += nums[end]; while (sum >= target) { // 当前窗口中的元素总和已经大于等于target if ((end - start + 1) < minLength) { minLength = end - start + 1; // 更新最短长度 } sum -= nums[start++]; // 尝试缩小窗口左侧边界的范围 } } return minLength == INT_MAX ? 0 : minLength; // 如果minLength未改变过说明无解 } ``` 此段程序实现了上述逻辑,利用双指针技巧(即滑窗法),使得时间复杂度保持在线性级别 \(O(n)\),并且只需要常量级别的辅助存储空间\(O(1)\)[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值