leetcode-Minimum Size Subarray Sum-209
输入一个数组和一个数s,求数组中的子数组的连续和>=s中最短的子数组
第一次的做法是:
先处理前缀和,然后二重循环枚举子数组,用前缀和sum[j]-sum[i-1]取得子数组的连续和,与s比较,更新答案。ON^2,超时
第二次做法:
既然ON^2超时,说明肯定是NlgN或者ON的做法,这题数组无序而且也不能排序之后做,所以也不可能是NlgN的做法,那么只有ON的做法,于是想到指针法
用两个指针i,j,初始都指向数组的第一个元素,然后遍历数组,求和:
1.sum>=s,更新答案,并且i++,注意i==j的情况要i++,j++
2.sum<s,说明现在和还不够,所以j++
1 class Solution { 2 public: 3 int minSubArrayLen(int s, vector<int>& nums) { 4 int len=nums.size(); 5 if(len==0) return 0; 6 int i=0,j=0; 7 int sum=nums[0]; 8 int ans=INT_MAX; 9 while(j<len){ 10 if(sum<s){ 11 sum+=nums[++j]; 12 } 13 else if(sum>=s){ 14 sum-=nums[i]; 15 ans=min(ans,j-i+1); 16 if(i==j){ 17 i++; 18 j++; 19 } 20 else i++; 21 } 22 } 23 if(ans!=INT_MAX) return ans; 24 return 0; 25 } 26 };