栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

Sliding Window

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Sliding Window

分为两个主要模块,要在一个滑动窗口中找最小值,以及最大值。

那么你需要去维护两个单调队列,一个是单调递增的队列,一个是单调递减的队列!

得到最小值:

//要写一个单调递增的单调队列得到最小值
void getMin()
{
	memset(que, 0, sizeof(que));
	que[0].value=-INF;
	int r=1,l=1;
	for(int i=1;i<=k;i++){
		while(que[r].value>=arr[i]&&l<=r){//单调递增
			r--;
		}
		que[++r].value=arr[i];//入队
		que[r].pos=i;
	}
	for(int i=k;i<=n;i++){
		while(que[r].value>=arr[i]&&l<=r){//单调递增
			r--;
		}
		que[++r].value=arr[i];//入队
		que[r].pos=i;
		while(que[l].pos<=i-k){
			l++;
		}
		printf("%d ",que[l].value);
	}
}

得到最大值

void getMax()
{
	memset(que, 0, sizeof(que));
	que[0].value=INF;
	int r=1,l=1;
	for(int i=1;i<=k;i++){
		while(que[r].value<=arr[i]&&l<=r){//单调递增
			r--;
		}
		que[++r].value=arr[i];//入队
		que[r].pos=i;
	}
	for(int i=k;i<=n;i++){
		while(que[r].value<=arr[i]&&l<=r){//单调递增
			r--;
		}
		que[++r].value=arr[i];//入队
		que[r].pos=i;
		while(que[l].pos<=i-k){
			l++;
		}
		printf("%d ",que[l].value);
	}
}

ac代码:

#include 
#include
#include 
using namespace std;

const int maxn = 1e6+10;
const int INF = 0x3f3f3f3f;

int n,k;
//开一个结构体,存位置和数值
struct node{
	int pos;
	int value;
}que[maxn];
//开一个数组存要存的num
int arr[maxn];
//要写一个单调递增的单调队列得到最小值
void getMin()
{
	memset(que, 0, sizeof(que));
	que[0].value=-INF;
	int r=1,l=1;
	for(int i=1;i<=k;i++){
		while(que[r].value>=arr[i]&&l<=r){//单调递增
			r--;
		}
		que[++r].value=arr[i];//入队
		que[r].pos=i;
	}
	for(int i=k;i<=n;i++){
		while(que[r].value>=arr[i]&&l<=r){//单调递增
			r--;
		}
		que[++r].value=arr[i];//入队
		que[r].pos=i;
		while(que[l].pos<=i-k){
			l++;
		}
		printf("%d ",que[l].value);
	}
}
//要写一个单调递减的单调队列得到最大值
void getMax()
{
	memset(que, 0, sizeof(que));
	que[0].value=INF;
	int r=1,l=1;
	for(int i=1;i<=k;i++){
		while(que[r].value<=arr[i]&&l<=r){//单调递增
			r--;
		}
		que[++r].value=arr[i];//入队
		que[r].pos=i;
	}
	for(int i=k;i<=n;i++){
		while(que[r].value<=arr[i]&&l<=r){//单调递增
			r--;
		}
		que[++r].value=arr[i];//入队
		que[r].pos=i;
		while(que[l].pos<=i-k){
			l++;
		}
		printf("%d ",que[l].value);
	}
}

int main() {
	scanf("%d%d",&n,&k);
	for(int i=1;i<=n;i++){
		scanf("%d",&arr[i]);
	}
	getMin();
	printf("n");
	getMax();
	return 0;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/702748.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号