LeetCode 862. 和至少为 K 的最短子数组
题目描述
给你一个整数数组 nums 和一个整数 k ,找出 nums 中和至少为 k 的 最短非空子数组 ,并返回该子数组的长度。如果不存在这样的 子数组 ,返回 -1 。
子数组 是数组中 连续 的一部分。
示例 1:
输入:nums = [1], k = 1
输出:1
LeetCode 862. 和至少为 K 的最短子数组
提示:
1 <= nums.length <= 105
-105 <= nums[i] <= 105
1 <= k <= 109
一、解题关键词
二、解题报告
1.思路分析
2.时间复杂度
3.代码示例
class Solution {
public int shortestSubarray(int[] nums, int k) {
int len = nums.length;
long[] dp = new long[len + 1];
for(int i = 0;i < len;i++){
dp[i + 1] = dp[i] + nums[i];
}
int ans = len + 1;
Deque<Integer> deque = new LinkedList<>();
for(int j = 0;j < dp.length; j++){
while(!deque.isEmpty() && dp[j] <= dp[deque.getLast()]){
deque.removeLast();
}
while( !deque.isEmpty() && dp[j] >= dp[deque.getFirst()] + k){
ans = Math.min(ans,j - deque.removeFirst());
}
deque.addLast(j);
}
return ans < len + 1 ? ans : -1;
}
}
2.知识点