滑动窗口模板 // 模板一 /* 滑动窗口算法框架 */ void slidingWindow(string s, string t) { unordered_map<char, int> need, window; for (char c : t) need[c]++; int left = 0, right = 0; int valid = 0; while (right < s.size()) { // c 是将移入窗口的字符 char c = s[right]; // 右移窗口 right++; // 进行窗口内数据的一系列更新 ... /*** debug 输出的位置 ***/ printf("window: [%d, %d)\n", left, right); /********************/ // 判断左侧窗口是否要收缩 while (window needs shrink) { // d 是将移出窗口的字符 char d = s[left]; // 左移窗口 left++; // 进行窗口内数据的一系列更新 ... } } } // 模板二 public int[] maxSlidingWindow(int[] nums, int k) { if(nums == null || nums.length == 0) { return new int[0]; } else if(k == 1) { return nums; } Deque<Integer> queue = new LinkedList<>(); int[] res = new int[nums.length - k + 1]; for(int i = 0, j = 0; i < nums.length; ++i) { if(!queue.isEmpty() && queue.peek() < i - k + 1) { queue.poll();; } while(!queue.isEmpty() && nums[i] > nums[queue.peekLast()]) { queue.removeLast(); } queue.addLast(i); if(i >= k - 1) { res[j++] = nums[queue.peek()]; } } return res; } ```