首页 > 其他分享 >AcWing 154. 滑动窗口

AcWing 154. 滑动窗口

时间:2023-12-04 11:34:05浏览次数:38  
标签:窗口 154 int 队头 front 滑动 AcWing

题面:
给定一个大小为 \(n≤10^6\) 的数组。
有一个大小为 \(k\) 的滑动窗口,它从数组的最左边移动到最右边。
你只能在窗口中看到 \(k\) 个数字。
每次滑动窗口向右移动一个位置。
你的任务是确定滑动窗口位于每个位置时,窗口中的最大值最小值

原题链接:154. 滑动窗口 - AcWing

#include <bits/stdc++.h>
using namespace std;

const int N = 1000005;
int a[N], n, k;

int main()
{
	deque<int> q;	//双端队列
	cin >> n >> k;
	for (int i = 1; i <= n; i++)
		cin >> a[i];
	//先求最小值,即单增队列
	for (int i = 1; i <= n; i++) {
		//当队尾元素大于当前值时,因为窗口从左往右滑动,队尾不可能成为最小值,故出队
		while (q.size() && q.back() > a[i])
			q.pop_back();
		q.push_back(a[i]);
		//当队元素满k个或队头在k个数之前,即队头元素在窗口外,队头出队
		if (i - k >= 1 && q.front() == a[i - k])
			q.pop_front();
		//前三个数已经被输入,窗口形成,开始输出队头对应的值
		if (i >= k)
			cout << q.front() << " ";
	}
	q.clear();
	cout << endl;

	//最大值同理
	for (int i = 1; i <= n; i++) {
		while (q.size() && q.back() < a[i])
			q.pop_back();
		q.push_back(a[i]);
		if (i - k >= 0 && q.front() == a[i - k])
			q.pop_front();
		if (i >= k)
			cout << q.front() << " ";
	}
}

标签:窗口,154,int,队头,front,滑动,AcWing
From: https://www.cnblogs.com/haruhomu/p/17874550.html

相关文章

  • AcWing 785. 快速排序
    题面:给定你一个长度为\(n\)的整数数列。请你使用快速排序对这个数列按照从小到大进行排序。并将排好序的数列按顺序输出。原题链接:785.快速排序-AcWing需要注意的几个点:左右哨兵的发动顺序;相同元素的相对位置;边界划分问题[1]。#include<bits/stdc++.h>usingna......
  • AcWing 4. 多重背包问题
    题面:有\(N\)件物品和一个容量是\(V\)的背包。第\(i\)件物品最多有\(s_i\)件,每件体积是\(v_i\),价值是\(w_i\)。求解将哪些物品装入背包,可使这些物品的体积总和不超过背包容量,且价值总和最大。输出最大价值。原题链接:4.多重背包问题I-AcWing多重背包实际上沿......
  • AcWing 5. 多重背包问题 II
    题面:有\(N\)件物品和一个容量是\(V\)的背包。第\(i\)件物品最多有\(s_i\)件,每件体积是\(v_i\),价值是\(w_i\)。求解将哪些物品装入背包,可使这些物品的体积总和不超过背包容量,且价值总和最大。输出最大价值。原题链接:5.多重背包问题II-AcWing先前的思路[1]:将......
  • AcWing 3. 完全背包问题
    题面:有\(N\)种物品和一个容量是\(V\)的背包,每种物品都有无限件可用。第\(i\)种物品的体积是\(v_i\),价值是\(w_i\)。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。原题链接:3.完全背包问题-AcWing根据01背包的思路扩......
  • AcWing 2. 01背包问题
    题面:有 \(N\) 件物品和一个容量是 \(V\) 的背包。每件物品只能使用一次。第 \(i\) 件物品的体积是 \(v_i\),价值是 \(w_i\)。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。原链接:2.01背包问题-AcWing有限集的最优问......
  • Acwing第132场周赛
    AcWing5366.大小写转换#include<bits/stdc++.h>#definelsp<<1#definersp<<1|1#definePIIpair<int,int>#definelllonglong#definedbdouble#defineullunsignedlonglong#defineendl'\n'#defineioios::sync_with_......
  • 前缀和/差分——acwing算法基础课笔记
    个人笔记,欢迎补充,指正。一维前缀和对于数组:a[1],a[2],a[3]...a[n];其前缀和数组为s[i]=a[1]+a[2]+...+a[i];下标必须从1开始求前缀和1for(inti=1;i<n;++i)2s[i]=s[i-1]+a[i];s[0]需要定义为0作用求原数组里一段数(l,r)的和......
  • 13、深度学习入门:P154、P155、P156、P157、P158、P159
    1、调整权重和偏置以便拟合训练数据的过程称为学习这句话指的是机器学习中模型训练的过程。在训练一个机器学习模型时,我们通常有一个训练数据集,其中包含输入和对应的期望输出。模型的目标是通过学习这些数据中的模式和规律,以便在未见过的数据上做出准确的预测或执行任务。模型学......
  • Acwing.第132场周赛
    Acwing.第132场周赛比赛地址A.大小写转换题目思路:简单的模拟,可以使用c++大小写转换库函数,但是由于我早上比赛时候没用好就不敢用了就用了ASCII码转换代码:#include<bits/stdc++.h>usingnamespacestd;voidsolve(){ strings; cin>>s; for(inti=0;i<s.size();i++)......
  • 《力扣面试150题》题单拓展——滑动窗口
    《力扣面试150题》题单拓展——滑动窗口1.基础知识先区分好,枚举右端点,还是左端点,窗口内的条件改变后,一般都是while控制另一个窗口的移动,然后收集结算我感觉滑动窗口这里变动最大的,什么时候去滑动左窗口,什么时候去收集答案,都很不一样,得慢慢体会滑动窗口难题是真的难,呜呜呜呜......