滑动窗口的最大值 (leetcode 239)


一:解题思路

方法一:使用二层循环进行遍历。O(k*n)

方法二:

方法三:

二:完整代码示例 (C、C++、Java、Python)

方法一C:

int max(int a, int b)
{
    return a > b ? a : b;
}

int* maxSlidingWindow(int* nums, int numsSize, int k, int* returnSize) 
{
    if (numsSize == 0) return nums;
    int* result = (int*)malloc(sizeof(int)*(numsSize-k+1));
    int left = 0;
    int maxValue = 0;
    int i = 0;
    for (left = 0; left <= numsSize - k; left++)
    {
        maxValue = nums[left];
        for (i = left; i < left + k; i++)
        {
            maxValue = max(maxValue,nums[i]);
        }
        result[left] = maxValue;
    }

    *returnSize = numsSize - k + 1;

    return result;
}

方法二C:

方法三C:

方法一C++:

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) 
    {
        if (nums.size() == 0) return nums;
        int n = nums.size();
        vector<int> result(n-k+1,0);
        for (int left = 0; left <= n - k; left++)
        {
            int maxValue = nums[left];
            for (int i = left; i < left + k; i++)
            {
                maxValue = max(maxValue,nums[i]);
            }
            result[left] = maxValue;
        }

        return result;
    }
};

方法二C++:

方法三C++:

 方法四C++(利用双端队列来做):

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        if (nums.size() == 0) return nums;
        deque<int> window;
        deque<int> result;

        for (int i = 0; i < nums.size(); i++) {
            if ((i >= k) && (window[0] <= i - k))
                window.pop_front();
            while (!window.empty() && nums[window[window.size() - 1]] <= nums[i])
            {
                window.pop_back();
            }
            window.push_back(i);
            if (i >= k - 1)
                result.push_back(nums[window[0]]);
        }

        vector<int> ret;

        while (!result.empty()) {
            ret.push_back(result.front());
            result.pop_front();
        }

        return ret;
    }
};

方法一Java:

方法二Java:

方法三Java:

方法一Python:

方法二Python(双端队列的方法):

class Solution:
    def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
        if not nums:
            return []
        window,result=[],[]#window存放下标,result存放最后的数组结果
        for i,x in enumerate(nums):
            if i>=k and window[0]<=i-k:
                window.pop(0)
            while window and nums[window[-1]]<=x:
                window.pop()
            window.append(i)
            if i>=k-1:
                result.append(nums[window[0]])
        return result