C++滑动门问题(附两种方法)

题目如下:

滑动窗口 - 题目 - Liuser's OJ

------引用自OJ网站

方法如下:

1.常规思想

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n,k;
	int a[110];
	cin>>n>>k;
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
	}
	for(int i=0;i<n-k;i++)
	{
		int ma=-1;
		for(int j=i;j<i+k;j++)
		{
			ma=max(ma,a[j]);
		}
		cout<<ma<<endl;
	}
	
	
	
	return 0;
}

做起来很简单,缺点也很明显

时间复杂度太高

遇到极端数据就会出错

2.栈思想

cpp 复制代码
#include<bits/stdc++.h>
#include<stack>
using namespace std;
int a[110];
int ma[110];
int n,k;
int l=0;
int main()
{
	stack<int> s;
	stack<int> ss;
	cin>>n>>k;
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
	}
	for(int i=0;i<k;i++)
	{
		if(s.empty()==true||s.top()<=a[i])
		{
			s.push(a[i]);
		}
		else if(s.top()>a[i])
		{
			int t=0;
			while(!(s.empty()==true||s.top()<=a[i]))
			{
				ss.push(s.top());
				s.pop();
				t++;
			}
			s.push(a[i]);
			for(int j=0;j<t;j++)
			{
				s.push(ss.top());
				ss.pop();
			}
		}
	}
	ma[++l]=s.top();
	while(s.empty()!=true)
	{
		ss.push(s.top());
		s.pop();
	}
	cout<<ss.top()<<" ";
	while(ss.empty()!=true)
	{
		s.push(ss.top());
		ss.pop();
	}
	for(int i=k;i<n;i++)
	{
		while(true)
		{
			if(a[i-k]==s.top())
			{
				s.pop();
				break;
			}
			ss.push(s.top());
			s.pop();
		}
		if(s.empty()==true)
		{
			s.push(ss.top());
			ss.pop();
		}
		if(a[i]<s.top())
		{
			while(true)
			{
				if(s.empty()==true)
				{
					s.push(a[i]);
					break;
				}
				if(a[i]<s.top())
				{
					ss.push(s.top());
					s.pop();
				}
				else
				{
					s.push(a[i]);
					break;
				}
			}
		}
		else if(a[i]>=s.top())
		{
			if(ss.empty()==true)
			{
				s.push(a[i]);
			}
			else
			{
				while(true)
				{
					if(ss.empty()==true)
					{
						s.push(a[i]);
						break;
					}
					if(ss.top()<=a[i])
					{
						s.push(ss.top());
						ss.pop();
					}
					else
					{
						s.push(a[i]);
						break;
					}
				}
			}
		}
		while(ss.empty()!=true)
		{
			s.push(ss.top());
			ss.pop();
		}
		ma[++l]=s.top();
		while(s.empty()!=true)
		{
			ss.push(s.top());
			s.pop();
		}
		cout<<ss.top()<<" ";
		while(ss.empty()!=true)
		{
			s.push(ss.top());
			ss.pop();
		}
	}
	cout<<endl;
	for(int i=1;i<=l;i++)
	{
		cout<<ma[i]<<" ";
	}
	
	
	return 0;
}

虽然写起来有亿点点麻烦,但是胜在稳定

!!!注意 !!!

作者写代码的时候没有注意数据范围,在网站里测试的时候会出错

自己在网站里测试的时候记得根据实际情况调整数据范围!!!!

相关推荐
Titan20243 小时前
Linux网络基础知识
linux·服务器·网络·c++·学习
从小就看凹凸曼^o^3 小时前
Python基础5 - 字典与集合:(1)字典
开发语言·python
侧耳倾听1113 小时前
java 日志框架简介
java·开发语言
zlinear数据采集卡4 小时前
数据采集卡从入门到精通(9):分辨率与精度——16位卡不等于1/65536的精度
开发语言·数据库·fpga开发·开源·c#
全栈技术负责人4 小时前
解密 MCP(Model Context Protocol):大模型时代的“Type-C”总线与三驾马车架构深度解析
开发语言·ai·架构
丰锋ff4 小时前
1.7在Qt窗口中添加右键菜单
开发语言·qt
Titan20244 小时前
Linux网络学习:套接字、UDP的封装与应用
linux·服务器·开发语言·网络·c++
Felven5 小时前
C2. Potions (Hard Version)
c++
鸿芯微控科技5 小时前
压电点胶阀出胶量不稳定怎么排查?驱动波形、背压、点胶重量与Python分析
开发语言·python·压电点胶阀·精密点胶·点胶重量·流体控制
原野池予5 小时前
深入Java集合框架:HashMap源码解析(JDK 8)
java·开发语言