【问题描述】
给定一个序列,输出其中各连续k长子序列的最小值。
【输入形式】
第一行2个数,n, k <= 10^5
第二行n个数
【输出形式】
一行n - k + 1个数,表示各连续k长子序列的最小值。
【样例输入】
10 3
10 2 4 5 3 1 2 8 9 6
【样例输出】
2 2 3 1 1 1 2 6
这道题比较简单,放到队列里主要是利用出队这个操作,即每进行一次比较后做一次出队操作,在进行比较。
因为是直接复制的顺序队列的定义和实现,所以有一些多余函数。
#include <iostream>
using namespace std;
class queue
{
private:
int* data;
int maxSize;
int front, rear;
void doublespace() {
int* tmp = data;
data = new int[2 * maxSize];
for (int i = 1; i < maxSize; ++i)
data[i] = tmp[(front + i) % maxSize];
front = 0; rear = maxSize - 1;
maxSize *= 2;
delete tmp;
}
public:
queue(int size = 10) {
data = new int[size];
maxSize = size;
front = rear = 0;
}
~queue() {
delete[] data;
}
void enqueue(const int x) {
if ((rear + 1) % maxSize == front) doublespace();
rear = (rear + 1) % maxSize;
data[rear] = x;
}
int dequeue() {
front = (front + 1) % maxSize;
return data[front];
}
int checkK(int k){
int tmp=100000;
for(int i=front+1; i<front+k+1;++i){
if(data[i]<tmp)
tmp=data[i];
}
return tmp;
}
};
int main()
{
queue T;
int n,k,x;
cin>>n>>k;
for (int i = 0; i < n; ++i) {
cin >> x;
T.enqueue(x);
}
for(int j=0;j<n-k+1;++j){
cout<<T.checkK(k)<<" ";
T.dequeue();
}
}
在这里插入代码片
这样可以利用队列一小部分的功能完成任务。
由于本身也不是精于程设,程序性能还是不太好,并且代码风格问题更多,只能用于应付作业。
有更加简洁的代码还希望能分享!
谢谢!