思路:
- 官网单调栈解答,单调递减栈
- 本人简单粗暴超时版
int* maxSlidingWindow(int* nums, int numsSize, int k, int* returnSize){
*returnSize = numsSize - k + 1;
int *ans = (int *)malloc(sizeof(int) * *returnSize);
int q[numsSize];//单调递减栈
int l = 0, r = 0;
for (int i = 0; i < k - 1; i++) {
while (l < r) {
if (q[r - 1] < nums[i])//把比将要加入的值小的全弹出
r--;
else
break;
}
q[r++] = nums[i];//加入当前值
}
for (int i = k - 1; i < numsSize; i++) {
while (l < r) {//把栈中比当前值小的全弹出
if (q[r - 1] < nums[i])
r--;
else
break;
}
q[r++] = nums[i];//加入当前值
ans[i - k + 1] = q[l];//当前的值是第几个框的最大值
if (q[l] == nums[i - k + 1]) //如果当前最大值是框的左边界,进行栈值的移动,之前已经框住了移动窗口的大小,每次i移动,就是框的移动,每次看框值和栈的值比较就行
l++;
}
return ans;
}
int max(int a,int b){
if(a>b)
return a;
else return b;
}
int* maxSlidingWindow(int* nums, int numsSize, int k, int* returnSize){
int res = 0;
* returnSize= 0;
int maxr = -9999;
int stack[numsSize] = {};
int right = -1;
int *ress = malloc(sizeof(int)*numsSize);
int top=0,down=0,count = 0;
int i=0;
while(down <= top && top < numsSize){
while(top<numsSize&&top-down<k){
maxr = max(maxr, nums[top]);
top++;
}
while(down <= top && top-down>=k)
{
ress[count++] = maxr;
stack[++right] = maxr
if(nums[down] != stack[right]) {
down++;
}
else {
right--;
maxr
down++;
}
}
}
*returnSize = count;
return ress;
}