题目
给定一个长度为 的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。
输入格式
第一行包含整数 。
第二行包含 个整数(均在 范围内),表示整数序列。
输出格式
共一行,包含一个整数,表示最长的不包含重复的数的连续区间的长度。
数据范围
输入样例:
5
1 2 2 3 5
输出样例:
3
解题
方法一:双指针
思路
双指针模板题:双指针模板。
维护 i
、j
两个指针标识一个子序列:i
一直向前并把 nums[i]
加入子序列,当某次加入 nums[i]
后该数出现的次数大于一次(存在重复数字)时,就要把 j
向后移并把 nums[j]
移出子序列,直到 cnts[nums[i]]
不在大于 ,在维护的序列中不存在重复元素时更新最长长度(max
)。
代码
import java.util.*;
import java.io.*;
public class Main {
static final int N = (int) 1e5 + 1;
public static void main(String[] args) throws IOException {
StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
in.nextToken();
int n = (int) in.nval;
int[] nums = new int[n];
for (int i = 0; i < n; ++i) {
in.nextToken();
nums[i] = (int) in.nval;
}
int[] cnts = new int[N];
int max = 0;
for (int i = 0, j = 0; i < n; ++i) {
++cnts[nums[i]];
while (j < i && cnts[nums[i]] > 1) --cnts[nums[j++]];
max = Math.max(max, i - j + 1);
}
System.out.println(max);
}
}
#include <iostream>
using namespace std;
const int N = 1e5 + 10;
int n;
int a[N], cnts[N];
int main() {
scanf("%d", &n);
for (int i = 0; i < n; ++i) scanf("%d", &a[i]);
int max_len = 0;
for (int i = 0, j = 0; i < n; ++i) {
++cnts[a[i]];
while (j < i && cnts[a[i]] > 1) --cnts[a[j++]];
max_len = max(max_len, i - j + 1);
}
printf("%d\n", max_len);
return 0;
}
评论区