码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode 862 shorest subarray with sum at least K

时间:2018-10-26 22:09:27      阅读:372      评论:0      收藏:0      [点我收藏+]

标签:back   一个队列   方法   sts   push   前缀   res   array   solution   

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

标签:back   一个队列   方法   sts   push   前缀   res   array   solution   

原文地址:https://www.cnblogs.com/liuweimingcprogram/p/9858641.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!