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;
}

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

!!!注意 !!!

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

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

相关推荐
香蕉可乐荷包蛋2 分钟前
Python学习之路(十三)-常用函数的使用,及优化
开发语言·python·学习
chian-ocean6 分钟前
零基础入门:用C++从零实现TCP Socket网络小工具
网络·c++·tcp/ip
惜.己10 分钟前
使用python的读取xml文件,简单的处理成元组数组
xml·开发语言·python·测试工具
apihz34 分钟前
域名WHOIS信息查询免费API使用指南
android·开发语言·数据库·网络协议·tcp/ip
珹洺1 小时前
C++算法竞赛篇:DevC++ 如何进行debug调试
java·c++·算法
coding随想1 小时前
掌控网页的魔法之书:JavaScript DOM的奇幻之旅
开发语言·javascript·ecmascript
爱吃烤鸡翅的酸菜鱼1 小时前
IDEA高效开发:Database Navigator插件安装与核心使用指南
java·开发语言·数据库·编辑器·intellij-idea·database
心情好的小球藻2 小时前
Python应用进阶DAY9--类型注解Type Hinting
开发语言·python
惜.己2 小时前
使用python读取json数据,简单的处理成元组数组
开发语言·python·测试工具·json
Y4090012 小时前
C语言转Java语言,相同与相异之处
java·c语言·开发语言·笔记