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;
}