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的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode题862 —— Shortest Subarray with Sum at Least K
LeetCode 862 和至少为K的最短子数组[前缀和 双端队列] HERODING的LeetCode之路