/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param num int整型一维数组 
 * @param numLen int num数组长度
 * @param size int整型 
 * @return int整型一维数组
 * @return int* returnSize 返回数组行数
 */
int* maxInWindows(int* num, int numLen, int size, int* returnSize ) {
    // write code here
    if(size == 0 || size > numLen) {
        *returnSize = 0;
        return NULL;
    }
    int *max = (int*)malloc(sizeof(int) * (numLen - size + 1));
    (*returnSize) = -1;
    int *inc = (int*)malloc(sizeof(int) * numLen);
    int left = 0, right = 0;
    int numIdx = 1;
    inc[0] = 0;
    while(numIdx < size) {
        printf("当前滑动窗口的索引值范围是%d-%d\n", numIdx - size + 1, numIdx);
        printf("正在查看数字%d\n", num[numIdx]);
        while(right >= left && num[inc[right]] < num[numIdx]) {
            printf("%d小于%d,右索引向左移\n",num[inc[right]],num[numIdx]);
            right--;
        }
        inc[++right] = numIdx++;
        printf("当前左索引%d,右索引%d\n", left, right);
        printf("左索引值为%d,右索引值为%d\n", num[inc[left]], num[inc[right]]);
        printf("当前numIdx:%d\n",numIdx);
    }
    (*returnSize) = 0;
    max[*returnSize] = num[inc[left]];
    printf("将滑动窗口中的最大值%d放入max数组中\n", num[inc[left]]);
    (*returnSize)++;
    while(numIdx < numLen) {
        printf("当前滑动窗口的索引值范围是%d-%d\n", numIdx - size + 1, numIdx);
        printf("正在查看数字%d\n", num[numIdx]);
        while(right >= left && num[inc[right]] < num[numIdx]) {
            right--;
            printf("%d小于%d,右索引向左移\n",num[inc[right + 1]],num[numIdx]);
        }
        inc[++right] = numIdx++;
        while(inc[left] < numIdx - size) {
            left++;
            printf("最左侧的索引值%d超出了滑动窗口的范围,当前滑动窗口的索引值范围是%d-%d\n", inc[left], numIdx - 1 - size, numIdx - 1);
        }
        printf("当前左索引%d,右索引%d\n", left, right);
        printf("左索引值为%d,右索引值为%d\n", num[inc[left]], num[inc[right]]);
        max[*returnSize] = num[inc[left]];
        printf("将滑动窗口中的最大值%d放入max数组中\n", num[inc[left]]);
        (*returnSize)++;
    }
    return max;
}