解題思路:
- 初始化窗口元素: 遍歷前 k 個元素,構建初始單調隊列。若當前索引對應值大于等于隊尾索引對應值,移除隊尾索引,將當前索引加入隊尾。遍歷結束時當前隊頭索引即為當前窗口最大值,將其存入結果數組。
- 處理剩余元素: 對于 k+1 之后的元素,加入規則同上。若隊頭索引已不在當前窗口范圍內(即deque.peekFirst() <= i - k),則移除隊頭索引。當前隊頭索引即為窗口最大值,將其存入結果數組。
Java代碼:
public class Solution {public int[] maxSlidingWindow(int[] nums, int k) {int n = nums.length;Deque<Integer> deque = new ArrayDeque<>();for (int i = 0; i < k; ++i) {while (!deque.isEmpty() && nums[i] >= nums[deque.peekLast()]) {deque.pollLast();}deque.offerLast(i);} int[] res = new int[n - k + 1];res[0] = nums[deque.peekFirst()];for (int i = k; i < n; ++i) {while (!deque.isEmpty() && nums[i] >= nums[deque.peekLast()]) {deque.pollLast();}deque.offerLast(i);if (deque.peekFirst() <= i - k) {deque.pollFirst();}res[i - k + 1] = nums[deque.peekFirst()];}return res;}
}
復雜度分析:
-
時間復雜度: O(n),每個元素最多入隊和出隊一次,因此總操作次數為線性時間。
-
空間復雜度: O(k),最壞情況下,隊列中存儲窗口內所有元素的索引(當數組嚴格遞減時)。
解題思路:
- 字符統計初始化: 使用兩個長度為 256 的數組 countT 和 countS,分別統計 t 中每個字符的出現次數,以及當前窗口中 s 的字符出現次數。
- 滑動窗口遍歷: 右指針 r:遍歷 s,將字符納入窗口,并更新 countS。?左指針 l:當窗口滿足包含 t 所有字符的條件時,盡可能向右收縮窗口,以尋找更小的有效窗口。
- 窗口有效性判斷: 通過 isInclude 方法檢查當前窗口的字符是否覆蓋了 t 的所有字符。
- 更新最小窗口: 每次找到有效窗口時,記錄其長度和位置,最終返回最小的窗口子串。
Java代碼:
class Solution {public String minWindow(String s, String t) {char[] S = s.toCharArray();char[] T = t.toCharArray();int n = S.length;int left = -1;int right = n;int[] countS = new int[128];int[] countT = new int[128];for (int i = 0; i < T.length; i++) {countT[T[i]]++;}int l = 0;for (int r = 0; r < n; r++) {countS[S[r]]++;while (isInclude(countS, countT)) {if (r - l < right - left) {right = r;left = l;}countS[S[l]]--;l++;}}return left < 0 ? "" : s.substring(left, right + 1);}public boolean isInclude(int[] countS, int[] countT) {for (int i = 0; i < 128; i++) {if (countS[i] < countT[i]) {return false;}}return true;}
}
復雜度分析:
- 時間復雜度: O(n),左右指針移動最多 2n 次。
- 空間復雜度: O(1),使用固定大小的數組,與輸入規模無關。