209. Minimum Size Subarray Sum

来源:互联网 发布:linux grub 配置 编辑:程序博客网 时间:2024/06/05 22:31

Given an array of n positive integers and a positive integer s, find the minimal length of a contiguous 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.

给定一组数和一个值,找到最短的子串,使得子串的和大于等于给定值。

我的思路:

模拟双指针的操作:

class Solution {public:    int minSubArrayLen(int s, vector<int>& nums) {        int n=nums.size();        if(n==0) return 0;        int i=0;        int j=0;        int sum=0;        int d=numeric_limits<int>::max();        while(j<n)        {            while(sum<s&&j<n)                sum+=nums[j++];            if(j==n&&sum<s) return d==numeric_limits<int>::max()?0:d;            j--;            d=min(d,j-i+1);//j指向当前最后一个元素,i指向第一个元素            if(d==1) break;            sum-=nums[i++];            if(j==n-1)//j已经到末尾了            {                while(sum-nums[i]>=s)                {                    sum-=nums[i++];                    d=min(d,j-i+1);                }                 break;            }            if(j<n-1)            {                j++;                sum-=nums[i++];                while(sum-nums[i]+nums[j]>=s)                {                    sum-=nums[i++];                    d=min(d,j-i+1);                }            }                    }        return d<=n?d:0;    }};

使用双指针较为简洁的方法:

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

另外一种二分法,虽然复杂度是nlogn的但是,也值得掌握

明天看吧:

int minSubArrayLen(int s, vector<int>& nums){    int n = nums.size();    if (n == 0)        return 0;    int ans = INT_MAX;    vector<int> sums(n + 1, 0); //size = n+1 for easier calculations    //sums[0]=0 : Meaning that it is the sum of first 0 elements    //sums[1]=A[0] : Sum of first 1 elements    //ans so on...    for (int i = 1; i <= n; i++)        sums[i] = sums[i - 1] + nums[i - 1];    for (int i = 1; i <= n; i++) {        int to_find = s + sums[i - 1];        auto bound = lower_bound(sums.begin(), sums.end(), to_find);        if (bound != sums.end()) {            ans = min(ans, static_cast<int>(bound - (sums.begin() + i - 1)));        }    }    return (ans != INT_MAX) ? ans : 0;}


原创粉丝点击