/**
* Note: The returned array must be malloced, assume caller calls free().
*/
#define MAX_NUMS_LEN 100000
int getmax(int a, int b)
{
    if (a > b) {
        return a;
    }
    return b;
}
int comp(const void *a, const void *b)
{
    if (*(int*)a < *(int*)b) {
        return 1;
    }
    return -1;
}
int* maxSlidingWindow(int* nums, int numsSize, int k, int* returnSize)
{
    int *result = NULL;
    int i;
    int tmp[MAX_NUMS_LEN] = {0};
    if (k == 1) {
        *returnSize = numsSize;
        return nums;
    }
    result = (int*)malloc(sizeof(int) * MAX_NUMS_LEN);
    (void)memset(result, 0, sizeof(int) * MAX_NUMS_LEN);
    if (numsSize <= k) {
        *returnSize = 1;
        qsort(nums, numsSize, sizeof(int), comp);
        result[0] = nums[0];
        return result;
    }
    for (i = 0; i < k; i++) {
        result[0] = getmax(result[0], nums[i]);
    }
    *returnSize = numsSize - k + 1;
    for (i = 1; i < *returnSize; i++) {
        // printf("%d nums[%d] : %d, nums[%d] : %d, \n", i, i - 1, nums[i - 1], i, nums[i]);
        // 新加进来的值比前面的最大值还大,因为前面的排序之后最大值是result[i - 1],所以新加进来的值就是当前区域的最大值
        if (nums[i + k - 1] >= result[i - 1]) {
            result[i] = nums[i + k - 1];
        } else if (nums[i - 1] == result[i - 1]) {
            // 上一个值就是上个区间的最大值,需要重新获取当前为起点的区间的最大值
            (void)memset(tmp, 0, sizeof(int) * MAX_NUMS_LEN);
            memcpy(tmp, &nums[i], k * sizeof(int));
            // printf("2  tmp[0] : %d, tmp[1] : %d, tmp[2] : %d\n", tmp[0], tmp[1], tmp[2]);
            qsort(tmp, k, sizeof(int), comp);
            result[i] = tmp[0];
        } else {
            // 新加进来的nums[i + k - 1]比result[i - 1]小,并且减出去的值不是上一个区间的最大值
            // 说明当前区间的最大值还在,直接赋值即可
            result[i] = result[i - 1];
        }
        // printf("3  result[%d] : %d\n", i, result[i]);
    }
    return result;
}