lintcode刷题——和大于S的最小子数组

来源:互联网 发布:word电脑软件 编辑:程序博客网 时间:2024/05/18 16:17

lintcode刷题之和大于s的最小子数组

原题如下:

给定一个由 n 个整数组成的数组和一个正整数 s ,请找出该数组中满足其和 ≥ s 的最小长度子数组。如果无解,则返回 -1。

样例

给定数组 [2,3,1,2,4,3] 和 s = 7, 子数组 [4,3] 是该条件下的最小长度子数组。

解题思路:
1、用两根指针,对数组进行遍历;

2、注意在判断子数组长度的时候,要用min来保证始终是最小的长度。

具体C++代码如下:
class Solution {
public:
    /**
     * @param nums: a vector of integers
     * @param s: an integer
     * @return: an integer representing the minimum size of subarray
     */
    int minimumSize(vector<int> &nums, int s) {
        // write your code here
        int start=0,end=0;
        int l=nums.size();
        if(l==0)
        return -1;
        int sum=0;
        int res=l+1;//res赋初值为数组长度加1
        while(end<l)
        {
            sum+=nums[end];
            if(sum>=s)
            {
                res=min(res,end-start+1);//为了保证此时的字数组长度是最小的
                while(sum>=s&&start<=end)//当满足子数组之和大于等于s的时候,第二根指针发挥作用,从头开始减去子数组里面的元素
                {
                    res=min(res,end-start+1);
                    sum-=nums[start];
                    start++;
                }
               
            }
            end++;
        }
       if(res==l+1)
       return -1;
       else
       return res;
    }
};

阅读全文
0 0
原创粉丝点击