题目大意

    给定一行数,共N个。有一个长度为K的窗口从左向右滑动,窗口中始终有K个数字,窗口每次滑动一个数字。求各个时刻窗口中的最大值和最小值。

题目分析

 
    每个元素最多入栈2次,出栈2次,平摊复杂度为O(n).

 
    有时可能还需要考虑栈和队列的size(如本题中的窗口)

实现(c++)

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define MAX_SIZE 1000005
int gMaxInWindow[MAX_SIZE];
int gMinInWindow[MAX_SIZE];
int gIncQ[MAX_SIZE];
int gDecQ[MAX_SIZE];
int gArray[MAX_SIZE];
int main(){
	int n, k;
	scanf("%d %d", &n, &k);
	int inc_front = 0, inc_tail = -1, dec_front = 0, dec_tail = -1;
	int ele;
	for (int i = 0; i < n; i++){
		scanf("%d", &ele);
		gArray[i] = ele;
		
		while (inc_tail >= inc_front && gArray[gIncQ[inc_tail]] >= ele){
			inc_tail--;
		}
		inc_tail++;
		gIncQ[inc_tail] = i;

		while (dec_tail >= dec_front && gArray[gDecQ[dec_tail]] <= ele){
			dec_tail--;
		}
		dec_tail++;
		gDecQ[dec_tail] = i;

		if (i - gIncQ[inc_front] >= k){
			inc_front++;
		}
		if (i - gDecQ[dec_front] >= k){
			dec_front++;
		}
		if (i >= k - 1){
			gMinInWindow[i - k + 1] = gArray[gIncQ[inc_front]];
			gMaxInWindow[i - k + 1] = gArray[gDecQ[dec_front]];
		}
	}
	for (int i = 0; i <= n - k; i++){
		printf("%d ", gMinInWindow[i]);
	}
	printf("\n");
	for (int i = 0; i <= n - k; i++){
		printf("%d ", gMaxInWindow[i]);
	}
	

	return 0;
}

 

相关文章:

  • 2021-11-28
猜你喜欢
  • 2021-12-06
  • 2021-10-02
相关资源
相似解决方案