算法学习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,时间复杂度挺高的,不过总归是过了

官方解法的队列 我再学学吧 后面再补充

posted @ 2022-03-13 11:36  浪漫主义程序员  阅读(25)  评论(0编辑  收藏  举报