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.