和至少为 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; } };
东北日出西边雨 道是无情却有情