public int minSubArrayLen(int s, int[] nums) {
int[] prefixSum = new int[n + 1];
for (int i = 1; i <= n; i++) {
prefixSum[i] = prefixSum[i - 1] + nums[i - 1];
int minLen = Integer.MAX_VALUE;
for (int i = 0; i < n; i++) {
int index = binarySearch(prefixSum, i + 1, n, prefixSum[i] + s);
minLen = Math.min(minLen, index - i);
return minLen == Integer.MAX_VALUE ? 0 : minLen;
public int binarySearch(int[] prefixSum, int start, int end, int target) {
while (start + 1 < end) {
mid = start + (end - start) / 2;
if (prefixSum[mid] < target) {
if (prefixSum[start] >= target) {
else if (prefixSum[end] >= target) {