和至少为 K 的最短子数组

 

 

 

思路分析 :

比较好想到的是用尺取法来做,但是数据有负数,如何还是按正常的尺取法做,那么得到的答案有可能不是最优解

那么我们可以用单调队列来求解,单调队列中保存前缀和

 

 

代码示例:

class Solution {
public:
    int shortestSubarray(vector<int>& nums, int k) {
        deque<int>que;
        int n = nums.size();
        vector<long long> sum(n+10);
        sum[0] = 0;
        for(int i = 1; i <= n; i++){
            sum[i] = sum[i-1] + nums[i-1];
            // printf("%d  ", sum[i]);
        }

        int ans = 99999999;
        for(int i = 0; i <= n; i++){
            while(!que.empty() && sum[i] <= sum[que.back()]){
                que.pop_back();
            }
            while(!que.empty() && sum[i]-sum[que.front()] >= (long long)k){
                ans = min(ans, i-que.front());
                que.pop_front();
            }

            que.push_back(i);
        }
        if (ans == 99999999) ans = -1;
        return ans;
    }
};

  

 

posted @ 2021-11-12 22:12  楼主好菜啊  阅读(45)  评论(0编辑  收藏  举报