209. Minimum Size Subarray Sum


209. Minimum Size Subarray Sum

My Submissions
Question
Total Accepted: 26840  Total Submissions: 105654  Difficulty: Medium

Given an array of n positive integers and a positive integer s, find the minimal length of a subarray of which the sum ≥ s. If there isn't one, return 0 instead.

For example, given the array [2,3,1,2,4,3] and s = 7,
the subarray [4,3] has the minimal length under the problem constraint.

click to show more practice.

Credits:
Special thanks to @Freezen for adding this problem and creating all test cases.

Subscribe to see which companies asked this question

Hide Tags
  Array Two Pointers Binary Search
Hide Similar Problems
  (H) Minimum Window Substring

分析:

这个题目一来就应该想到应该一点一点累加恰好找到这个s的累加和,统计出长度
所以接着缩小数据,再次找到恰好大于s的位置,更新最小长度,恰好是为了尽可能小
具体:用一个迭代器慢ite1,一个迭代器快ite2
如果当前序列的和小于s则ite2继续右移动(增加和),否则ite1右移动(相当于减小和)

class Solution {
public:
    int minSubArrayLen(int s, vector<int>& nums) {
        if(nums.empty())
            return 0;
        vector<int>::iterator ite1=nums.begin();
        vector<int>::iterator ite2=ite1;
        int minLen=INT_MAX;
        int curSum=*ite1,curLen=1;
        while(true)
        {
            if(curSum >= s )
            {   
                if(curLen <minLen)
                    minLen=curLen;
                curSum-=*ite1;
                ite1++;
                curLen--;
                continue;
            }
            ite2++;
            if(ite2==nums.end())
                break;
            curLen++;
            curSum+=*ite2;
        }
        
        if(minLen==INT_MAX)
            return 0;
        return minLen;    
    }
};


别人的算法

(本质一样),O(N)的速度:

class Solution {
public:
    int minSubArrayLen(int s, vector<int>& nums) {
        int n = nums.size(), start = 0, sum = 0, minlen = INT_MAX;
        for (int i = 0; i < n; i++) { 
            sum += nums[i]; 
            while (sum >= s) {
                minlen = min(minlen, i - start + 1);
                sum -= nums[start++];
            }
        }
        return minlen == INT_MAX ? 0 : minlen;
    }
};


注:本博文为EbowTang原创,后续可能继续更新本文。如果转载,请务必复制本条信息!

原文地址:http://blog.csdn.net/ebowtang/article/details/50453943

原作者博客:http://blog.csdn.net/ebowtang

你可能感兴趣的:(LeetCode,算法,面试,数组,数学)