您的位置:首页 > 其它

<LeetCode OJ>Minimum Size Subarray Sum【209】

2016-01-04 09:25 399 查看


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;
    }
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: