【Leetcode】209. Minimum Size Subarray Sum

231 阅读1分钟

题目地址:

leetcode.com/problems/mi…

给定一个正整数数组,再给定一个正数s,求数组的最短子数组的和大于等于s,返回其长度。

思路是,开快慢双指针i和j,并开一个变量来维护[i:j]这个区间内的和(包括端点)。如果这个区间和大于等于s,则更新最短长度,并让i后移,同时区间和减去A[i];如果这个区间和小于s,则右移j。代码如下:

public class Solution {
    public int minSubArrayLen(int s, int[] nums) {
        int res = nums.length + 1, sum = 0;
        for (int i = 0, j = 0; j < nums.length; ) {
        	// sum维护nums[i, ..., j]的和
            sum += nums[j];
            // 如果和大于等于s,说明区间[i : j]满足条件,更新长度,并让i后移
            while (sum >= s) {
                res = Math.min(res, j - i + 1);
                sum -= nums[i];
                i++;
            }
            
            // 上面的循环已经把以nums[j]结尾的满足条件的子数组都算过了,则让j后移
            j++;
        }
        
        // res未得到更新,则说明不存在解,返回0;否则返回res
        return res == nums.length + 1 ? 0 : res;
    }
}

时间复杂度O(n),空间O(1)。

  1. 相关链接:209. Minimum Size Subarray Sum · leetcode

  2. (27条消息) 【Leetcode】209. Minimum Size Subarray Sum_记录算法的博客-CSDN博客