package LeetCode; public class LeetCode209 { // https://leetcode.com/problems/minimum-size-subarray-sum/description/ // æ´åè§£æ³ // è¯¥æ¹æ³å¨ Leetcode ä¸ä¼è¶ æ¶ï¼ // æ¶é´å¤æåº¦: O(n^3) // 空é´å¤æåº¦: O(1) public int minSubArrayLen(int s, int[] nums) { if (s <= 0 || nums == null) throw new IllegalArgumentException("Illigal Arguments"); int res = nums.length + 1; for (int l = 0; l < nums.length; l++) for (int r = l; r < nums.length; r++) { int sum = 0; for (int i = l; i <=r; i++) sum += nums[i]; if (sum >= s) res = Math.min(res, r - l + 1); } // æ è§£çæ åµ if (res == nums.length + 1) return 0; return res; } // ä¼åæ´åè§£ // æ¶é´å¤æåº¦: O(n^2) // 空é´å¤æåº¦: O(n) public int minSubArrayLen2(int s, int[] nums) { if(s <= 0 || nums == null) throw new IllegalArgumentException("Illigal Arguments"); // sums[i]åæ¾nums[0...i-1]çå int[] sums = new int[nums.length + 1]; sums[0] = 0; for(int i = 1 ; i <= nums.length ; i ++) sums[i] = sums[i-1] + nums[i-1]; int res = nums.length + 1; for(int l = 0 ; l < nums.length ; l ++) for(int r = l ; r < nums.length ; r ++){ // 使ç¨sums[r+1] - sums[l] å¿«éè·å¾nums[l...r]çå if(sums[r+1] - sums[l] >= s) res = Math.min(res, r - l + 1); } // æ è§£çæ åµ if(res == nums.length + 1) return 0; return res; } // æ»å¨çªå£çæè·¯ // æ¶é´å¤æåº¦: O(n) // 空é´å¤æåº¦: O(1) public int minSubArrayLen3(int s, int[] nums) { if(s <= 0 || nums == null) throw new IllegalArgumentException("Illigal Arguments"); int l = 0 , r = -1; // nums[l...r]为æä»¬çæ»å¨çªå£ int sum = 0; int res = nums.length + 1; while(l < nums.length){ // çªå£ç左边ç卿°ç»èå´å ,å循ç¯ç»§ç» if(r + 1 < nums.length && sum < s) sum += nums[++r]; else // rå·²ç»å°å¤´ æè sum >= s sum -= nums[l++]; if(sum >= s) res = Math.min(res, r - l + 1); } // æ è§£çæ åµ if(res == nums.length + 1) return 0; return res; } // å¦å¤ä¸ä¸ªæ»å¨çªå£çå®ç°, ä» ä¾åè // æ¶é´å¤æåº¦: O(n) // 空é´å¤æåº¦: O(1) public int minSubArrayLen4(int s, int[] nums) { if(s <= 0 || nums == null) throw new IllegalArgumentException("Illigal Arguments"); int l = 0 , r = -1; // [l...r]为æä»¬ççªå£ int sum = 0; int res = nums.length + 1; while(r + 1 < nums.length){ // çªå£çå³è¾¹çæ æ³ç»§ç»æ©å±äº, å循ç¯ç»§ç» while(r + 1 < nums.length && sum < s) sum += nums[++r]; if(sum >= s) res = Math.min(res, r - l + 1); while(l < nums.length && sum >= s){ sum -= nums[l++]; if(sum >= s) res = Math.min(res, r - l + 1); } } if(res == nums.length + 1) return 0; return res; } // æ¶é´å¤æåº¦: O(nlogn) // 空é´å¤æåº¦: O(n) // äºåæç´¢ public int minSubArrayLen5(int s, int[] nums) { if(s <= 0 || nums == null) throw new IllegalArgumentException("Illigal Arguments"); // sums[i]åæ¾nums[0...i-1]çå int[] sums = new int[nums.length + 1]; sums[0] = 0; for(int i = 1 ; i <= nums.length ; i ++) sums[i] = sums[i-1] + nums[i-1]; int res = nums.length + 1; for(int l = 0 ; l < nums.length - 1 ; l ++){ // Javaç±»åºä¸æ²¡æå ç½®çlowerBoundæ¹æ³ï¼ // æä»¬éè¦èªå·±å®ç°ä¸ä¸ªåºäºäºåæç´¢çlowerBound:) int r = lowerBound(sums, sums[l] + s); if(r != sums.length){ res = Math.min(res, r - l); } } if(res == nums.length + 1) return 0; return res; } // å¨æåºæ°ç»numsä¸å¯»æ¾å¤§äºçäºtargetçæå°å¼ // å¦ææ²¡æï¼numsæ°ç»ä¸ææå¼é½å°äºtargetï¼ï¼åè¿ånums.length private int lowerBound(int[] nums, int target){ if(nums == null /*|| !isSorted(nums)*/) throw new IllegalArgumentException("Illegal argument nums in lowerBound."); int l = 0, r = nums.length; // å¨nums[l...r)çèå´é寻æ¾è§£ while(l != r){ int mid = l + (r - l) / 2; if(nums[mid] >= target) r = mid; else l = mid + 1; } return l; } public static void main(String[] args) { int[] nums = {2, 3, 1, 2, 4, 3}; int s = 7; System.out.println((new LeetCode209()).minSubArrayLen(s, nums)); } }