三种语言实现双指针解决最长不重复子序列(C++/Python/Java)
题目
给定一个长度为 n 的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。
输入格式
第一行包含整数 n。
第二行包含 n 个整数(均在 0∼1e5 范围内),表示整数序列。
输出格式
共一行,包含一个整数,表示最长的不包含重复的数的连续区间的长度。
数据范围
1≤n≤1e5
输入样例:
5
1 2 2 3 5
输出样例:
3
C++
#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int a[N], v[N];
int main()
{
int n;
cin >> n;
for(int i = 1; i <= n; i++)
cin >> a[i];
int ans = 1;
for(int i = 1, j = 1; i <= n && j <= n; j++)
{
v[a[j]]++;
while(v[a[j]] > 1)
{
v[a[i]]--;
i++;
}
ans = max(ans, j-i+1);
}
cout << ans << endl;
}
Python
n = int(input())
a = [int(x) for x in input().split()]
v = [0] * 100010
i = 0
j = 0
ans = 1
while i < n and j < n:
v[a[j]] += 1
while v[a[j]] > 1:
v[a[i]] -= 1
i += 1
j += 1
ans = max(ans, j-i)
print(ans)
Java
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] a = new int[n+1];
int[] v = new int[100010];
for(int i = 1; i <= n; i++)
a[i] = sc.nextInt();
int ans = 1;
for(int i = 1, j = 1; i <= n && j <= n; j++)
{
v[a[j]]++;
while(v[a[j]] > 1)
{
v[a[i]]--;
i++;
}
ans = Math.max(ans, j-i+1);
}
System.out.println(ans);
}
}

浙公网安备 33010602011771号