这题是 LeetCode 862. Shortest Subarray with Sum at Least K经典难题前缀和 单调双端队列O(n) 解法。题目要点给你一个整数数组 nums 和整数 k找和 ≥ k的最短非空连续子数组长度数组可正可负所以不能用普通滑动窗口Java 最优解法单调队列javaimport java.util.Deque;import java.util.LinkedList;public class Solution {public int shortestSubarray(int[] nums, int k) {int n nums.length;long[] prefix new long[n 1];// 前缀和数组 for (int i 0; i n; i) { prefix[i 1] prefix[i] nums[i]; } DequeInteger deque new LinkedList(); int minLen Integer.MAX_VALUE; for (int i 0; i n; i) { // 满足 prefix[i] - prefix[deque.peekFirst()] k while (!deque.isEmpty() prefix[i] - prefix[deque.peekFirst()] k) { minLen Math.min(minLen, i - deque.pollFirst()); } // 维护单调递增队列去掉队尾比当前大的 while (!deque.isEmpty() prefix[i] prefix[deque.peekLast()]) { deque.pollLast(); } deque.offerLast(i); } return minLen Integer.MAX_VALUE ? -1 : minLen; }}核心思路一句话1. 前缀和把区间和变成 prefix[j] - prefix[i]2. 单调递增队列存下标保证前面的前缀和越小越好保证下标越近越好3. 对每个 j 从队头找最小的 i 满足 prefix[j] - prefix[i] ≥ k 更新最短长度。复杂度时间O(n)每个元素最多入队、出队各一次空间O(n)前缀和数组 双端队列需要我给你讲手算模拟过程或者出一道同类型变形题练手吗