1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| class Solution { public int minSubArrayLen(int target, int[] nums) { int[] prefixSum = new int[nums.length]; prefixSum[0] = nums[0]; for (int i = 1; i < nums.length; i++) { prefixSum[i] = prefixSum[i - 1] + nums[i]; } int ans = Integer.MAX_VALUE; for (int i = 0; i < prefixSum.length; i++) { if (prefixSum[i] < target) continue; int offset = prefixSum[i] - target; int leftBound = binarySearch(prefixSum, 0, i - 1, offset); ans = Math.min(ans, i - leftBound); } return ans == Integer.MAX_VALUE ? 0 : ans; }
private int binarySearch(int[] prefixSum, int left, int right, int target) { int ans = -1; while (left <= right) { int mid = left + (right - left) / 2; if (prefixSum[mid] <= target) { ans = mid; left = mid + 1; } else { right = mid - 1; } } return ans; } }
|