leetcode 862. 和至少为 K 的最短子数组

184 阅读1分钟

c++

class Solution {
public:
    int shortestSubarray(vector<int>& nums, int k) {
        deque<int> que;
        vector<long long> sum(nums.size() + 1, 0);
        que.push_back(0);
        for (int i = 0; i < nums.size(); i++) sum[i + 1] = sum[i] + nums[i];
        int pos = -1, ans = -1;
        for (int i = 0; i < sum.size(); i++) {
            while (que.size() && sum[i] - sum[que.front()] >= k) {
                pos = que.front();
                que.pop_front();
            }
            if (pos != -1 && (i - pos < ans || ans == -1)) ans = i - pos;
            while (que.size() && sum[que.back()] > sum[i]) que.pop_back();
            que.push_back(i);
        }
        return ans;
    }
};

js

var shortestSubarray = function(nums, k) {
    var que = [0];
    var sum = new Array(nums.length + 1).fill(0);
    for (var i = 0; i < nums.length; i++) sum[i + 1] = sum[i] + nums[i];
    var pos = -1, ans = -1;
    for (var i = 0; i < sum.length; i++) {
        while (que.length && sum[i] - sum[que[0]] >= k) {
            pos = que[0];
            que.shift();
        }
        if (pos != -1 && (i - pos < ans || ans == -1)) ans = i - pos;
        while (que.length && sum[que[que.length - 1]] > sum[i]) que.pop();
        que.push(i);
    }
    return ans;
};