LintCode-和大于S的最小子数组

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

您在真实的面试中是否遇到过这个题?  Yes
样例

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

挑战

如果你已经完成了O(n)时间复杂度的编程,请再试试 O(n log n)时间复杂度。

标签 
Expand  

相关题目 
Expand 

分析:数组的题目一般都是前缀和阿(对应O(nlgn)的解法),或者就是两根指针同方向走啊,或者反方向走啊什么的。。。

代码:

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 ret = INT_MAX;
        int start = 0;
        int end = 0;
        int sum = 0;
        while(end<nums.size())
        {
            sum+=nums[end];
            if(sum>=s)
            {
                ret = min(ret,end-start+1);
                while(sum>=s&&start<=end)
                {
                    ret = min(ret,end-start+1);
                    sum-=nums[start];
                    start++;
                }
            }
            end++;
        }
        if(ret == INT_MAX)
            ret = -1;
        return ret;
    }
};
点赞