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

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

!!!注意 !!!

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

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

相关推荐
思麟呀1 天前
Linux的基础IO流
linux·运维·服务器·开发语言·c++
星释1 天前
Rust 练习册 :Pythagorean Triplet与数学算法
开发语言·算法·rust
星释1 天前
Rust 练习册 :Nth Prime与素数算法
开发语言·算法·rust
lkbhua莱克瓦241 天前
Java基础——集合进阶3
java·开发语言·笔记
多喝开水少熬夜1 天前
Trie树相关算法题java实现
java·开发语言·算法
QT 小鲜肉1 天前
【QT/C++】Qt定时器QTimer类的实现方法详解(超详细)
开发语言·数据库·c++·笔记·qt·学习
WBluuue1 天前
数据结构与算法:树上倍增与LCA
数据结构·c++·算法
lsx2024061 天前
MySQL WHERE 子句详解
开发语言
Tony Bai1 天前
【Go模块构建与依赖管理】09 企业级实践:私有仓库与私有 Proxy
开发语言·后端·golang
Lucky小小吴1 天前
开源项目5——Go版本快速管理工具
开发语言·golang·开源