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