209 Minimum Size Subarray Sum 大于给定和最短子数组
给定一个含有 n 个正整数的数组和一个正整数 s , 找到一个最小的连续子数组的长度,使得这个子数组的数字和 ≥ s 。如果不存在符合条件的子数组,返回 0。
举个例子,给定数组 [2,3,1,2,4,3] 和 s = 7,
子数组 [4,3]为符合问题要求的最小长度。
更多练习:
如果你找到了O(n) 解法, 请尝试另一个时间复杂度为O(n log n)的解法。
详见:https://leetcode.com/problems/minimum-size-subarray-sum/description/
Java实现:
方法一:时间复杂度O(nlogn)
class Solution { public int minSubArrayLen(int s, int[] nums){ int[] sums = new int[nums.length + 1]; for (int i = 1; i < sums.length; i++){ sums[i] = sums[i - 1] + nums[i - 1]; } int minLen = Integer.MAX_VALUE; for (int i = 0; i < sums.length; i++){ int end = binarySearch(i + 1, sums.length - 1, sums[i] + s, sums); if (end == sums.length){ break; } if (end - i < minLen) { minLen = end - i; } } return minLen == Integer.MAX_VALUE ? 0 : minLen; } public int binarySearch(int l, int h, int key, int[] sums){ while (l <= h){ int m = (l + h)>>1; if (sums[m] >= key) h = m - 1; else l = m + 1; } return l; } }
参考:https://www.cnblogs.com/jimmycheng/p/7477562.html
方法二:时间复杂度O(n)
class Solution { public int minSubArrayLen(int s, int[] nums) { int n=nums.length; if(n==0||nums==null){ return 0; } int left=0; int right=0; int sum=0; int res=Integer.MAX_VALUE; while(right<n){ while(sum<s&&right<n){ sum+=nums[right++]; } while(sum>=s){ res=Math.min(res,right-left); sum-=nums[left++]; } } return res>n?0:res; } }
C++实现:
class Solution { public: int minSubArrayLen(int s, vector<int>& nums) { int n=nums.size(); if(n==0||nums.empty()) { return 0; } int left=0,right=0,sum=0,res=INT_MAX; while(right<n) { while(sum<s&&right<n) { sum+=nums[right++]; } while(sum>=s) { res=min(res,right-left); sum-=nums[left++]; } } return res>n?0:res; } };
参考:https://www.cnblogs.com/grandyang/p/4501934.html