zoukankan      html  css  js  c++  java
  • [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;
        }
    };
  • 相关阅读:
    Linux在高铁项目的部署环境
    【牛刀小试2】password保
    fcitx的安装_配置
    Mingw:在Linux系统下编译Windows的程序
    linux安装qwt插件linux
    qt超强绘图控件qwt
    WIN7 下 Qt Creator 安装 QWT
    QWT6.0.1+win7下安装说明
    qwt 介绍
    Linux中的svn客户端RabbitVCS-2
  • 原文地址:https://www.cnblogs.com/grandyang/p/5810138.html
Copyright © 2011-2022 走看看