天天看點

雙指針(最長連續不重複子序列)

  題目描述

給定一個長度為n的整數序列,請找出最長的不包含重複數字的連續區間,輸出它的長度。

  輸入格式

第一行包含整數n。

第二行包含n個整數(均在0~100000範圍内),表示整數序列。

  輸出格式

共一行,包含一個整數,表示最長的不包含重複數字的連續子序列的長度。

  資料範圍

1≤n≤100000

  輸入樣例

5

1 2 2 3 5

  輸出樣例

3
#include<iostream>

using namespace std;

const int N = 1e6;
int n,t;
int a[N], s[N];

int main()
{
	cin >> n;
	for (int i = 0; i < n; i++) cin >> a[i];

	int res = 0;
	for (int i = 0, j = 0; i < n; i++)
	{
		s[a[i]]++;
		while (s[a[i]] > 1)
		{
			s[a[j]]--;
			j++;
		}
		res = max(res, i - j + 1);
	}
	cout << res << endl;
	return 0;
}
           

 思路:利用雙指針法,令j為慢指針,i為快指針,如果快指針的元素出現過,那麼就将慢指針往前走,并消除标記,直到把和快指針的元素相等的那個标記去掉。快指針每次往前走的是标記,慢指針走是取消标記,每次更新最大值就行了。

繼續閱讀