Leetcode209题长度最小的子数组

题目

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

示例

输入: s = 7, nums = [2,3,1,2,4,3]
输出: 2
解释: 子数组 [4,3] 是该条件下的长度最小的连续子数组。

题解

本题可以采用双指针法进行求解,利用双指针维护一个滑动窗口,当窗口内的子数组和大于s时就向前移动左指针,当小于s时就向前移动右指针。

class Solution {
    public int minSubArrayLen(int s, int[] nums) {
        /*
        本题利用双指针法维持一个滑动窗口,当窗口内的子数组和大于s时就移动左指针,当小于s时就移动右指针
        
        
        */
        int len = nums.length;
        int sum = 0;
        int left = 0;
        int right = 0;
        int result = nums.length + 1;
        while(right < len){
            while(sum < s && right < len){    //滑动窗口子数组和大于目标值时向右滑动右指针
                sum += nums[right];
                right++;
            }
            while(sum >= s){    //滑动窗口子数组和小于等于目标值时,向右滑动左指针,并求解最小长度
                result = Math.min(result, right - left);
                sum -= nums[left];
                left++;
            }
        }
        return result == (nums.length + 1) ? 0 : result;    //对特殊情况进行判断,如果s大于整个数组和就直接返回0
    }
}

猜你喜欢

转载自www.cnblogs.com/jianglinliu/p/11831333.html