week11作業D 必做題11-4

在這裏插入圖片描述
樣例:
Input
7
2 2 2 1 1 2 2
Output
4
Input
6
1 2 1 2 1 2
Output
2
Input
9
2 2 1 1 1 2 2 2 2
Output
6
這題用滑窗的思想解決。具體細節和註釋都在代碼裏。

#include<iostream>
using namespace std;
int a[100100];
int number[3];
int n;
int main()
{
	cin>>n;
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
	}
	int left=0,right=0;
	for(int i=0;i<3;i++)
	{
		number[i]=0;
	}
	number[a[left]]++;
	int temp=a[left];//temp存儲的是當前的壽司種類
	int maxx=0;//存儲當前最長序列長度 
	while(right<n)
	{
		if(right+1<n)
		{
			right++;
			number[a[right]]++;
			if(a[right]!=temp)//壽司的種類變化了
			{
				temp=a[right];
				if(a[left]==a[right])//例如2 2 2 1 1 2 2,a[left]=a[right]時left=0,right=5,那麼最左邊的那段2序列就得捨棄掉,所以number[2]=1,left也相應變化 
				{
					number[a[left]]=1;
					left=right-1;
				}
				else
				{
					if(number[a[right]]<=number[a[left]])//例如2 2 2 1 1 2 2,比如left=0,right=3,此時a[left]=2,a[right]=1,只有這種情況下才會進入這個else 
					{
						if(maxx<2*number[a[right]])
						{
							maxx=2*number[a[right]];
						}
					}
				}
			} 
			else
			{
				if(number[a[right]]<=number[a[left]]&&a[left]!=a[right])//2 2 2 1 1 2 2,例如left=0,right從3變到4 
				{
					if(maxx<2*number[a[right]])
					{
						maxx=2*number[a[right]];
					}
				}
			}
		}
		else
		{
			break;
		}
	}
	cout<<maxx;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章