leetcode 239 滑动窗口的最大值 (C语言)ps.图解

  • Post author:
  • Post category:其他


我们要求的是滑动窗口内的最大值,当然可以用暴力解法,遍历一遍数组,再遍历一遍0 到 k的位置,时间复杂度是 O(n*k);

我们这题用单调队列会好很多,当然也可以用优先队列,但是C语言并没有提供这种库函数,所以实现起来不如单调队列简单。

思路:

题目要求我们是求滑动窗口的最大值,所以我们只需要保证,队列的出口的第一个值,是该窗口的最大值,就OK了,我们只需要维护这个值。

第一步:

找到该窗口的最大值。

第二步:

将该值前面小于它的值全部出队,保证队列出口的值是该窗口的最大值。

注:这只是我们模拟的情况。

需要用到辅助数组;

第三步:

将该值保存下来。

下面贴出代码,会有注释帮助大家理解

int* maxSlidingWindow(int* nums, int numsSize, int k, int* returnSize) 
{
    // 辅助数组
    int q[numsSize];
    int left = 0, right = 0; 


    for (int i = 0; i < k; i++)
    {
        // 将最大值始终保持在队列出口
        while (left < right && nums[i] < nums[q[right - 1]])
        {
            right--;
        }        

        q[right++] = i;
    }

    // 创建保存最大值的返回数组
    *returnsSize = 0;

    // 数组长度是 k移动到数组末尾的次数;
    int* ans = (int*)malloc(sizeof(int) * numsSize - k + 1);

    // 保存最大值
    ans[(*retuansSize)++] = nums[q[left]];
    

    for (int i = k; i < numsSize; i++)
    {
        while (left < right && nums[i] < nums[q[right - 1]])
        {
            right--;
        }
        

        q[right++] = i;

        // 跟着滑动窗口移动。 保证该窗口的最大值在队列出口处
        while (left <= i - k)
        {
            left++;
        }

        ans[(*returnSize)++] = nums[q[left]];
    }

    return ans;
}



版权声明:本文为qq_48718265原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。