1. 程式人生 > 其它 >LeetCode:239. Sliding Window Maximum滑動視窗最大值(C語言)

LeetCode:239. Sliding Window Maximum滑動視窗最大值(C語言)

技術標籤:LeetCode

題目描述:
給你一個整數陣列 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]

示例 3:

輸入:nums = [1,-1], k = 1
輸出:[1,-1]

示例 4:

輸入:nums = [9,11], k = 2
輸出:[11]

示例 5:

輸入:nums = [4,-2], k = 2
輸出:[4]

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/sliding-window-maximum

著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
解答:

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
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; } *returnSize = 0; int* ans = malloc(sizeof(int) * (numsSize - k + 1)); ans[(*returnSize)++] = nums[q[left]]; for (int i = k; i < numsSize; ++i) { while (left < right && nums[i] >= nums[q[right - 1]]) { right--; } q[right++] = i; while (q[left] <= i - k) { left++; } ans[(*returnSize)++] = nums[q[left]]; } return ans; }

執行結果:
在這裡插入圖片描述
Notes:
完全參考官方答案!