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 };

 

posted @ 2016-09-01 14:24  0_summer  阅读(124)  评论(0编辑  收藏  举报