数组模拟队列
代码模板
const int N = 1e6 + 10;
int q[N], hh = 0, rr = -1;
void push(int x) {
q[++rr] = x;
}
void pop() {
++hh;
}
void isempty() {
return hh <= rr;
}
void query() {
cout << q[hh] << endl;
}
滑动窗口:求滑动窗口里的最小值为例
思路分析:
- 如果下标i、j都在滑动窗口内部, 而且i < j, 但是a[i] > a[j], 因此, a[i]永远不可能作为答案出现。
- 因此,每次在队列里插入的数时应保证队尾元素比要插入的数小,因此构造出单调递增的队列。
const int N = 1e6 + 10;
int a[N],q[N];
int hh, tt;
void solve() {
int n,k; scanf("%d%d",&n,&k);
for(int i = 0; i < n; i++) scanf("%d",&a[i]);
hh = 0, tt = -1;
for(int i = 0; i < n; i++){
if (hh <= tt && i - k + 1 > q[hh]) hh ++ ;
while (hh <= tt && a[q[tt]] >= a[i]) tt -- ;
q[ ++ tt] = i;
if (i >= k - 1) printf("%d ", a[q[hh]]);
}
}
原文链接: https://www.cnblogs.com/Hot-machine/p/13191769.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;
也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/358829
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!