862. 和至少为 K 的最短子数组
生活随笔
收集整理的這篇文章主要介紹了
862. 和至少为 K 的最短子数组
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
862. 和至少為 K 的最短子數組
返回 A 的最短的非空連續子數組的長度,該子數組的和至少為 K 。
如果沒有和至少為 K 的非空子數組,返回 -1 。
- 示例 1:
輸入:A = [1], K = 1
輸出:1
- 示例 2:
輸入:A = [1,2], K = 4
輸出:-1
- 示例 3:
輸入:A = [2,-1,2], K = 3
輸出:3
提示:
- 1 <= A.length <= 50000
- -10 ^ 5 <= A[i] <= 10 ^ 5
- 1 <= K <= 10 ^ 9
解題思路
因為對于當前y來說,必須滿足P[y]-P[x]>=K,k又必然是正數,所以p[y]必須大于p[x]。對于y后面的y2來說,即使滿足P[y2]-P[x]>=K,[x,y2]之間也不是最短的,因為p[y]<p[x],所以必然滿足P[y2]-P[y]>=K,y比x更加接近y2,生成的長度更短,所以x可以直接pop掉,對答案不會產生影響
因為此時我們構成了一個P[y]-P[x]>=K,這個y已經是最接近x的了,即長度最短,后面即使還能滿足P[y]-P[x]>=K,長度也不夠當前長度短
代碼
class Solution {public int shortestSubarray(int[] nums, int k) {int n=nums.length,res=n+1;LinkedList<Integer> list=new LinkedList<>();long[] pre=new long[n+1];for(int i=1;i<=n;i++)pre[i]=pre[i-1]+(long)nums[i-1];for(int i=0;i<n+1;i++){while(!list.isEmpty()&&pre[i]<pre[list.getLast()])list.removeLast();while(!list.isEmpty()&&pre[i]-pre[list.getFirst()]>=k){res=Math.min(res,i-list.removeFirst());}list.add(i);}return res==n+1?-1:res;}}總結
以上是生活随笔為你收集整理的862. 和至少为 K 的最短子数组的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到鸡蛋破了是什么意思
- 下一篇: 1109. 航班预订统计