Leetcode 209: Minimum Size Subarray Sum

https://leetcode.com/problems/minimum-size-subarray-sum/

Minimum Size Subarray Sum

Total Accepted: 20591 Total Submissions: 84896 Difficulty: Medium

Given an array of n positive integers and a positive integer s, find the minimal length of a subarray of which the sum ≥ s. If there isn’t one, return 0 instead.

For example, given the array [2,3,1,2,4,3] and s = 7,
the subarray [4,3] has the minimal length under the problem constraint.

click to show more practice.

Credits:
Special thanks to @Freezen for adding this problem and creating all test cases.

Code 

import sys

class Solution(object):
    def minSubArrayLen(self, s, nums):
        """
        :type s: int
        :type nums: List[int]
        :rtype: int
        """
        p1 = p2 = 0
        cum = 0
        min_len = sys.maxint        

        for num in nums:
            cum += num
            if cum >=s:
                min_len = min(min_len, p1-p2+1)
                while p2 < p1:
                    if cum-nums[p2] >=s:
                        cum = cum-nums[p2]
                        p2 += 1
                        min_len = min(min_len, p1-p2+1)
                    else:
                        break
            p1 += 1

        return 0 if min_len == sys.maxint else min_len

 

Idea

Remember that all numbers are positive. You can have a fast pointer `p1` and a slow pointer `p2`. You first make the fast pointer to traverse the numbers until sum from nums[p2] to nums[p1] is more than s. Then, you start to move `p2` forward until the sum from nums[p2] to nums[p1] is no more than s anymore. In total, `p1` and `p2` both traverse at most O(N) distance. So the time complexity of the algorithm is O(N). Since we don’t require additional space, the space complexity of the alogrithm is O(1).

 

Leave a comment

Your email address will not be published. Required fields are marked *