本问题对应的 leetcode 原文链接:剑指 Offer 59 – I. 滑动窗口的最大值

问题描述

给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。

示例 :

输入: 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

提示:

你可以假设 k 总是有效的,在输入数组 不为空 的情况下,1 ≤ k ≤ nums.length

解题思路

视频讲解直达: 本题视频讲解

代码实现

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        if(nums == null || nums.length <= 1){
            return nums;
        }

        LinkedList<Integer> queue = new LinkedList<>();
        int[] res = new int[nums.length - k + 1];
        int index = 0;

        //K

        for(int i = 0; i < nums.length; i++){
            while(!queue.isEmpty() && nums[queue.peekLast()] <= nums[i]){
                queue.pollLast();
            }

            queue.add(i);

            if(queue.peekLast() - k == queue.peek()){
                queue.poll();
            }

            if(i + 1 >= k){
                res[index++] = nums[queue.peek()];
            }
        }

        return res;
    }
}

时间复杂度:O(n)
额外空间复杂的:O(k)

Python

from collections import deque

class Solution(object):
    def maxSlidingWindow(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: List[int]
        """
        if not nums or len(nums) < k:
            return []

        queue = deque()
        res = []

        for i in range(len(nums)):
            while queue and nums[queue[-1]] <= nums[i]:
                queue.pop()

            queue.append(i)

            if queue[0] == i - k:
                queue.popleft()

            if i >= k - 1:
                res.append(nums[queue[0]])

        return res

C++

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        if (nums.empty() || nums.size() < k) {
            return vector<int>();
        }

        deque<int> queue;
        vector<int> res;

        for (int i = 0; i < nums.size(); i++) {
            while (!queue.empty() && nums[queue.back()] <= nums[i]) {
                queue.pop_back();
            }

            queue.push_back(i);

            if (queue.front() == i - k) {
                queue.pop_front();
            }

            if (i >= k - 1) {
                res.push_back(nums[queue.front()]);
            }
        }

        return res;
    }
};

Go

func maxSlidingWindow(nums []int, k int) []int {
    if len(nums) < k || nums == nil {
        return []int{}
    }

    queue := make([]int, 0)
    res := make([]int, 0)

    for i := 0; i < len(nums); i++ {
        for len(queue) > 0 && nums[queue[len(queue)-1]] <= nums[i] {
            queue = queue[:len(queue)-1]
        }

        queue = append(queue, i)

        if queue[0] == i-k {
            queue = queue[1:]
        }

        if i >= k-1 {
            res = append(res, nums[queue[0]])
        }
    }

    return res
}

JS

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number[]}
 */
var maxSlidingWindow = function(nums, k) {
    if (!nums || nums.length < k) {
        return [];
    }

    const queue = [];
    const res = [];

    for (let i = 0; i < nums.length; i++) {
        while (queue.length && nums[queue[queue.length - 1]] <= nums[i]) {
            queue.pop();
        }

        queue.push(i);

        if (queue[0] === i - k) {
            queue.shift();
        }

        if (i >= k - 1) {
            res.push(nums[queue[0]]);
        }
    }

    return res;
};

发表回复

后才能评论