leetcode 239 滑动窗口最大值

leetcode 239 滑动窗口最大值_第1张图片

lession learn:

1、 如果出现一个新的最大值, 则队列清零

2、 如果出现的数字比上一个最大值小, 则需要记录在队列中

      其中队列满时需要把队列中最早加入的数字删除, 并重新排序

      队列不满时仅需要按顺序加入队列即可。

3、 第一个K个数字需要全部进入队列。

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */

typedef struct {
    int position;
    int value;
} pair_t;

int cmp(const void *a, const void *b)
{
    pair_t *pa = (pair_t *)a;
    pair_t *pb = (pair_t *)b;
    return pb->value - pa->value;
}
int cmp1(const void *a, const void *b)
{
    pair_t *pa = (pair_t *)a;
    pair_t *pb = (pair_t *)b;
    return pa->position - pb->position;
}
int* maxSlidingWindow(int* nums, int numsSize, int k, int* returnSize)
{
    if (nums == NULL || numsSize <= 0) {
        *returnSize = 0;
        return NULL;
    }
    int pos = 0;
    int num = 0;
    pair_t *queue = (pair_t *)malloc(numsSize * sizeof(pair_t));
    int *res = (int *) malloc((numsSize - k + 1) * sizeof(int));
    for (int i = 0; i < k; i++) {
        queue[pos].value = nums[i];
        queue[pos++].position = i;
    }
    qsort(queue, pos, sizeof(pair_t), cmp);
    res[num++] = queue[0].value;
    for (int i = k; i < numsSize; i++) {
        if (nums[i] >= queue[0].value) {
            pos = 0;
            queue[pos].value = nums[i];
            queue[pos++].position = i;
        } else {
            if ((i - queue[0].position) < k) {
                if (pos == k) {
                    qsort(queue, pos, sizeof(pair_t), cmp1);
                    queue[0].value = nums[i];
                    queue[0].position = i;
                    qsort(queue, pos, sizeof(pair_t), cmp);
                } else {
                    queue[pos].value = nums[i];
                    queue[pos++].position = i;
                }
            } else {
                queue[0].value = nums[i];
                queue[0].position = i;
                qsort(queue, pos, sizeof(pair_t), cmp);

            }           
        }
        res[num++] = queue[0].value;
    }
    *returnSize = numsSize - k + 1;
    return res;
}

 

你可能感兴趣的:(leetcode 239 滑动窗口最大值)