[LintCode] Minimum Size Subarray Sum 最小子数组和的大小

 

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 -1 instead.

 
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.

Challenge

If you have figured out the O(n) solution, try coding another solution of which the time complexity is O(n log n).

 

LeetCode上的原题,请参见我之前的博客Minimum Size Subarray Sum

 

解法一:

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) {
        int res = INT_MAX, sum = 0, left = 0;
        for (int i = 0; i < nums.size(); ++i) {
            sum += nums[i];
            if (sum >= s) {
                while (left < i && sum >= s) {
                    res = min(res, i - left + 1);
                    sum -= nums[left++];
                }
            }
        }
        return res == INT_MAX ? -1 : res;
    }
};

 

解法二:

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) {
        int res = INT_MAX, n = nums.size();
        vector<int> sums(n + 1, 0);
        for (int i = 1; i < n + 1; ++i) sums[i] = sums[i - 1] + nums[i - 1];
        for (int i = 0; i < n + 1; ++i) {
            int left = i + 1, right = n, t = sums[i] + s;
            while (left <= right) {
                int mid = left + (right - left) / 2;
                if (sums[mid] < t) left = mid + 1;
                else right = mid - 1;
            }
            if (left == n + 1) break;
            res = min(res, left - i);
        }
        return res == INT_MAX ? -1 : res;
    }
};

 

posted @ 2016-08-26 14:07  Grandyang  阅读(957)  评论(0编辑  收藏  举报
Fork me on GitHub