三种语言实现双指针解决最长不重复子序列(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);
    }
}
posted @ 2024-08-01 10:58  火车驶向云外0218  阅读(26)  评论(0)    收藏  举报