Description: Given an array of positive integers nums and a positive integer target, return the minimal length of a subarray whose sum is greater than or equal to target. If there is no such subarray, return 0 instead.

Code:

def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        left = curr = 0
        ans = float('inf')
        
        for right in range(len(nums)):
            curr += nums[right]
            while curr >= target:
                ans = min(ans, right - left + 1)
                curr -= nums[left]
                left += 1
            
        return 0 if ans == float('inf') else ans

Efficiency:

Time Complexity: O(n)

Space Complexity: O(1)

Test:

# --- Inline assert tests ---
assert minSubArrayLen(7, [2,3,1,2,4,3]) == 2    # [4,3]
assert minSubArrayLen(15, [1,2,3,4,5]) == 5     # [1,2,3,4,5]
assert minSubArrayLen(4, [1,4,4]) == 1          # [4]
assert minSubArrayLen(100, [1,2,3,4,5]) == 0    # returns 0, No valid subarray
assert minSubArrayLen(5, []) == 0              # returns 0, No valid subarray
assert minSubArrayLen(11, [1,2,3,4,5]) == 3     # [3,4,5]

print("All minSubArrayLen test cases passed")

Note: This works only when all nums[i] > 0. If the array can contain zeros or negative numbers, this logic won’t hold because shrinking the window doesn’t guarantee a reduced sum.