leetcode 862 shorest subarray with sum at least K

Posted stupid_one

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode 862 shorest subarray with sum at least K相关的知识,希望对你有一定的参考价值。

https://leetcode.com/problems/shortest-subarray-with-sum-at-least-k/

 

首先回顾一下求max子数组的的方法是:记录一个前缀min值,然后扫一遍sum数组。

 

1、首先这里不需要最大,因为刚好够k就好了

2、这里需要距离最短。就是数组的长度最短。

 

这里的思路也一样,不过保存很多个min值,就是用一个队列,保存前缀的min值,不需要最min,只不过有更小的就更好。

也就是如果sum数组的值是:

..... 60, 40.....Y.....

那么在原本的队列中,60可以pop出来了,因为他被40代替了,因为Y减去40的值肯定比60大,更有可能大于k,而且这样距离也更短。

class Solution {
public:
    int shortestSubarray(vector<int> A, int k) {
        int len = (int)A.size();
        deque<int> que;
        vector<int> sum(len + 1, 0);
        for (int i = 0; i < len; ++i) {
            sum[i + 1] = sum[i] + A[i];
        }
        int ans = len + 1;
        que.push_back(0);
        for (int i = 1; i <= len; ++i) {
            while (que.size() > 0 && sum[i] - sum[que.front()] >= k) {
                ans = min(ans, i - que.front());
                que.pop_front();
            }
            while (que.size() > 0 && sum[i] <= que.back()) {
                que.pop_back();
            }
            que.push_back(i);
        }
        return ans == len + 1 ? -1 : ans;
    }
} t;

 

以上是关于leetcode 862 shorest subarray with sum at least K的主要内容,如果未能解决你的问题,请参考以下文章

今天又一题,单调队列leetcode862

LeetCode题862 —— Shortest Subarray with Sum at Least K

LeetCode 862 和至少为K的最短子数组[前缀和 双端队列] HERODING的LeetCode之路

⭐算法入门⭐《队列 - 单调队列》困难03 —— LeetCode 862. 和至少为 K 的最短子数组

leetcode 581

leetcode 581