LeetCode 0209. Minimum Size Subarray Sum Solution in Java, C++, Python & More | Explanation + Code

CoderIndeed
0
0209. Minimum Size Subarray Sum

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.

 

Example 1:

Input: target = 7, nums = [2,3,1,2,4,3]
Output: 2
Explanation: The subarray [4,3] has the minimal length under the problem constraint.

Example 2:

Input: target = 4, nums = [1,4,4]
Output: 1

Example 3:

Input: target = 11, nums = [1,1,1,1,1,1,1,1]
Output: 0

 

Constraints:

  • 1 <= target <= 109
  • 1 <= nums.length <= 105
  • 1 <= nums[i] <= 104

 

Follow up: If you have figured out the O(n) solution, try coding another solution of which the time complexity is O(n log(n)).

Solutions

Solution 1: Prefix Sum + Binary Search

First, we preprocess the prefix sum array s of the array nums, where s[i] represents the sum of the first i elements of the array nums. Since all elements in the array nums are positive integers, the array s is also monotonically increasing. Also, we initialize the answer ans = n + 1, where n is the length of the array nums.

Next, we traverse the prefix sum array s. For each element s[i], we can find the smallest index j that satisfies s[j] ≥ s[i] + target by binary search. If j ≤ n, it means that there exists a subarray that satisfies the condition, and we can update the answer, i.e., ans = min(ans, j - i).

Finally, if ans ≤ n, it means that there exists a subarray that satisfies the condition, return ans, otherwise return 0.

The time complexity is O(n × log n), and the space complexity is O(n). Here, n is the length of the array nums.

PythonJavaC++GoTypeScriptRustC#
class Solution: def minSubArrayLen(self, target: int, nums: List[int]) -> int: n = len(nums) s = list(accumulate(nums, initial=0)) ans = n + 1 for i, x in enumerate(s): j = bisect_left(s, x + target) if j <= n: ans = min(ans, j - i) return ans if ans <= n else 0(code-box)

Solution 2: Two Pointers

We can use two pointers j and i to maintain a window, where the sum of all elements in the window is less than target. Initially, j = 0, and the answer ans = n + 1, where n is the length of the array nums.

Next, the pointer i starts to move to the right from 0, moving one step each time. We add the element corresponding to the pointer i to the window and update the sum of the elements in the window. If the sum of the elements in the window is greater than or equal to target, it means that the current subarray satisfies the condition, and we can update the answer, i.e., ans = min(ans, i - j + 1). Then we continuously remove the element nums[j] from the window until the sum of the elements in the window is less than target, and then repeat the above process.

Finally, if ans ≤ n, it means that there exists a subarray that satisfies the condition, return ans, otherwise return 0.

The time complexity is O(n), and the space complexity is O(1). Here, n is the length of the array nums.

PythonJavaC++GoTypeScript
class Solution: def minSubArrayLen(self, target: int, nums: List[int]) -> int: l = s = 0 ans = inf for r, x in enumerate(nums): s += x while s >= target: ans = min(ans, r - l + 1) s -= nums[l] l += 1 return 0 if ans == inf else ans(code-box)

Post a Comment

0Comments

Post a Comment (0)

#buttons=(Accept !) #days=(20)

Our website uses cookies to enhance your experience. Check Now
Accept !