长度为n的数组求其中有几个长度为k的区间数字是连续的(无重复)
2015-05-31 07:49
232 查看
//单调队列
#include <iostream> # include<stdio.h> using namespace std; #define MAX 1000001 int A[MAX]; //存储数据 int Q[MAX]; //队列 int P[MAX]; //存储A[i]中的下标i int Min[MAX]; //输出最小 int Max[MAX]; //输出最大 int n,k; void get_min() { int i; int head=1,tail=0; for(i=0; i<k-1; i++) //先把前两个入队 { while(head<=tail && Q[tail]>=A[i]) //队尾元素大于要插入的数 --tail; Q[++tail]=A[i]; P[tail]=i; } for(; i<n; i++) { while(head<=tail && Q[tail]>=A[i]) --tail; Q[++tail]=A[i]; P[tail]=i; while(P[head]<i-k+1) //判断数是否过时,即窗口是否已经划过这个数,我这是从0开始计数的。 { head++; } Min[i-k+1]=Q[head]; } } void get_max() { int i; int head=1,tail=0; for(i=0; i<k-1; i++) { while(head<=tail && Q[tail]<=A[i]) //队尾元素小于要插入的值 --tail; Q[++tail]=A[i]; P[tail]=i; } for(; i<n; i++) { while(head<=tail && Q[tail]<=A[i]) //队尾元素小于要插入的值 --tail; Q[++tail]=A[i]; P[tail]=i; while(P[head]<i-k+1) { head++; } Max[i-k+1]=Q[head]; } } int main() { int i; int coun; while(scanf("%d%d",&n,&k)!=EOF) { coun=0; for(i=0; i<n; i++) scanf("%d",&A[i]); get_min(); get_max(); for(int i=0;i<n-k+1;i++) if((Max[i]-Min[i])==(k-1)) coun++; printf("%d\n",coun); } return 0; }
相关文章推荐
- Spring AOP 深入剖析
- OSChina 周日乱弹 —— 正确的撸串方式
- 第十三周项目一 动物怎么叫(抽象类)
- Foreign LINUX让你在Windows上运行Linux应用
- JSplitPane demo
- 3.SRS文档
- git add 详细介绍
- 探索核能利用的漫长之路
- MySQL 5.5.23半同步复制配置安装
- SpringMVC笔记
- 开始用Node.js编程
- 自定义实现InputFormat、OutputFormat、输出到多个文件目录中去、hadoop1.x api写单词计数的例子、运行时接收命令行参数,代码例子
- CentOS下安装配置Tomcat环境
- 从网易搬家到博客园
- java相关
- 第三章:模块加载系统(requirejs)
- target
- and that led to his
- TCP传输中使用AES加密和gizp压缩(2)--封装TcpUtil,封装后实现登陆
- TCP传输中使用AES加密和gizp压缩(2)--封装TcpUtil,封装后实现登陆