1. 程式人生 > 其它 >演算法學習100天——14 滑動視窗2

演算法學習100天——14 滑動視窗2

題目地址(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,時間複雜度挺高的,不過總歸是過了

官方解法的佇列 我再學學吧 後面再補充