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 totarget. 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.
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] \geq s[i] + target\) by binary search. If \(j \leq 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 \leq n\), it means that there exists a subarray that satisfies the condition, return \(ans\), otherwise return \(0\).
The time complexity is \(O(n \times \log n)\), and the space complexity is \(O(n)\). Here, \(n\) is the length of the array \(nums\).
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 \leq 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\).