演算法學習100天——14 滑動視窗2
阿新 • • 發佈:2022-03-13
題目地址(239. 滑動視窗最大值)
https://leetcode-cn.com/problems/sliding-window-maximum/
題目描述
給你一個整數陣列 nums,有一個大小為 k 的滑動視窗從陣列的最左側移動到陣列的最右側。你只可以看到在滑動視窗內的 k 個數字。滑動視窗每次只向右移動一位。 返回 滑動視窗中的最大值 。 示例 1: 輸入:nums = [1,3,-1,-3,5,3,6,7], k = 3 輸出:[3,3,5,5,6,7] 解釋: 滑動視窗的位置 最大值 --------------- ----- [1 3 -1] -3 5 3 6 7 3 1 [3 -1 -3] 5 3 6 7 3 1 3 [-1 -3 5] 3 6 7 5 1 3 -1 [-3 5 3] 6 7 5 1 3 -1 -3 [5 3 6] 7 6 1 3 -1 -3 5 [3 6 7] 7 示例 2: 輸入:nums = [1], k = 1 輸出:[1] 提示: 1 <= nums.length <= 105 -104 <= nums[i] <= 104 1 <= k <= nums.length
思路
利用滑動視窗思想,每一次維護一個長度為k的滑動視窗,只需要遍歷找出視窗中的最大值輸出就好
程式碼
class Solution { public int[] maxSlidingWindow(int[] nums, int k) { int max = nums[0]; int right = 0; int maxIndex = 0; int[] res = new int[nums.length - k + 1]; int j = 0; for(int i = 0; i < nums.length - k + 1; i++){ // 如果記錄的最大值已經走出視窗,清除最大值 if(i > maxIndex){ maxIndex = i; max = nums[i]; for (int m = i; m <= i + k - 1 && m < nums.length; m++){ if (nums[m] > max){ max = nums[m]; maxIndex = m; } } } // 找到有邊界 while(right - i + 1 <= k){ // 獲取當前視窗的最大值和下標 if(nums[right] >= max){ max = nums[right]; maxIndex = right; } right ++; } res[j++] = max; } return res; } }
結果
執行用時:1998 ms, 在所有 Java 提交中擊敗了5.01%的使用者
記憶體消耗:59.2 MB, 在所有 Java 提交中擊敗了17.50%的使用者
enmmmmm,時間複雜度挺高的,不過總歸是過了
官方解法的佇列 我再學學吧 後面再補充