<LeetCode OJ> 209. Minimum Size Subarray Sum

来源:互联网 发布:v70摩托罗拉淘宝 编辑:程序博客网 时间:2024/05/22 10:22

209. Minimum Size Subarray Sum

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.


分析:

这个题目一来就应该想到应该一点一点累加恰好找到这个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

1 0