STL deque实现滑动最小值问题

本文介绍如何利用C++中的STL deque数据结构解决滑动最小值问题。详细阐述了题目要求,包括输入输出示例,并列举了deque的主要操作函数,如push_front、push_back、insert、erase等,帮助理解如何利用deque特性高效求解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近学校开设的数据结构布置了一道作业,要求使用双端队列解决滑动最小值的问题,所以我就打算使用STL中的deque来解决

题目要求:

问题:滑动最小值

描述:给定一个长度为n的数列a0,a1,a2,。。。an-1和一个整数k。

求数列bi=min{ai,ai+1,。。。ai+k-1}

限制条件:1<=k<=n<=106,  0<=ai<=109

输入:

n=5

K=3

a={1,3,5,4,2}

输出:b={1,3,2}


deque的函数

(1)    构造函数

deque():创建一个空deque

deque(int nSize):创建一个deque,元素个数为nSize

deque(int nSize,const T& t):创建一个deque,元素个数为nSize,且值均为t

deque(const deque &):复制构造函数

(2)    增加函数

void push_front(const T& x):双端队列头部增加一个元素X

void push_back(const T& x):双端队列尾部增加一个元素x

iterator insert(iterator it,const T& x):双端队列中某一元素前增加一个元素x

void insert(iterator it,int n,const T& x):双端队列中某一元素前增加n个相同的元素x

void insert(iterator it,const_iterator first,const_iteratorlast):双端队列中某一元素前插入另一个相同类型向量的[forst,last)间的数据

(3)    删除函数

Iterator erase(iterator it):删除双端队列中的某一个元素

Iterator erase(iterator first,iterator last):删除双端队列中[first,last)中的元素

void pop_front():删除双端队列中最前一个元素

void pop_back():删除双端队列中最后一个元素

void clear():清空双端队列中最后一个元素

(4)    遍历函数

reference at(int pos):返回pos位置元素的引用

reference front():返回手元素的引用

reference back():返回尾元素的引用

iterator begin():返回向量头指针,指向第一个元素

iterator end():返回指向向量中最后一个元素下一个元素的指针(不包含在向量中)

reverse_iterator rbegin():反向迭代器,指向最后一个元素

reverse_iterator rend():反向迭代器,指向第一个元素的前一个元素

(5)    判断函数

bool empty() const:向量是否为空,若true,则向量中无元素

(6)    大小函数

Int size() const:返回向量中元素的个数

int max_size() const:返回最大可允许的双端对了元素数量值


(7)    其他函数

void swap(deque&):交换两个同类型向量的数据

void assign(int n,const T& x):向量中第n个元素的值设置为x


while((d.at(i) <= d.back()) && (&d.at(i) != &d.back()))	//当队尾元素大于或等于a[i],但a[i]不做为队尾判断
{
	d.pop_back();
	n--;   //n = k;
}
while (d.at(i) > d.back())
{
	for (j = i; j <  i+n - 1; j++)	//当a[i]大于队尾时,a[i]之后的元素往前移动,出队的仍然是队尾
	{
		d.at(j) = d.at(j + 1);
	}
		d.pop_back();
		n--;
}

在a[i]大于队尾的时候,并不能使用当a[i]小于队尾时的解决方法来实现,因为a[i]不是队头,并不能从队头出队,所以我只好使用移动元素的方法来将a[i]覆盖掉,最后可以将队尾元素出队


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值