209. 长度最小的子数组

209. 长度最小的子数组

问题

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

示例:

输入: 《209. 长度最小的子数组》
输出: 《209. 长度最小的子数组》
解释: 子数组 《209. 长度最小的子数组》 是该条件下的长度最小的连续子数组。

进阶:

如果你已经完成了《209. 长度最小的子数组》 时间复杂度的解法, 请尝试《209. 长度最小的子数组》 时间复杂度的解法。

解法

连续子数组,考虑使用双指针《209. 长度最小的子数组》《209. 长度最小的子数组》滑动窗口来判断.设置一个《209. 长度最小的子数组》值,表示滑动窗口中的和,每一轮循环,判断《209. 长度最小的子数组》《209. 长度最小的子数组》的关系,有两种情况:

  • 《209. 长度最小的子数组》大于等于《209. 长度最小的子数组》,此时《209. 长度最小的子数组》减去《209. 长度最小的子数组》指针所指向的值,《209. 长度最小的子数组》指针前进。
  • 《209. 长度最小的子数组》小于《209. 长度最小的子数组》,此时,《209. 长度最小的子数组》加上《209. 长度最小的子数组》的值,《209. 长度最小的子数组》指针前进。

代码

java实现

class Solution {
    public int minSubArrayLen(int s, int[] nums) {
        // 注意这里的end的起始位置
        int start = 0, end = -1;
        int result = Integer.MAX_VALUE, sum = 0;
        // 开始循环,循环跳出的条件是start指针循环到数组尾部了
        while (start < nums.length) {
            // 这里需要注意判断条件
            if (sum < s && end + < nums.length) {
                end++;
                sum += nums[end];            
            } else {
                sum -= nums[start];
                start++;
            }
            if (sum >= s) result = result < end - start + 1 ? result : end - start + 1;
        }
        return result == Integer.MAX_VALUE ? 0 : result;
    }
}
    原文作者:王可尊
    原文地址: https://www.jianshu.com/p/9f8f0968e58b
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞