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;

 

posted on 2018-10-26 20:43  stupid_one  阅读(199)  评论(0编辑  收藏  举报

导航