1、题目描述
给定一个长度为n的整数序列,请找出最长的不包含重复数字的连续区间,输出它的长度。
输入格式
第一行包含整数n。
第二行包含n个整数(均在0~100000范围内),表示整数序列。
输出格式
共一行,包含一个整数,表示最长的不包含重复数字的连续子序列的长度。
数据范围
1≤n≤1000001≤n≤100000
输入样例:
5 1 2 2 3 5
输出样例:
3
2、代码
双指针算法:找单调性。
两个指针i、j。i = 0, j = 0
后指针(i)从前往后移动,前指针(j)指的是最左的位置,所以j只能 j ++。
import java.io.*;
import java.util.*;
public class Main{
static int N = 100010;
static int[] a = new int[N];
static int[] s = new int[N]; //记录数组元素出现次数
public static void main(String[] args) {
Scanner in = new Scanner(new BufferedInputStream(System.in));
int n = in.nextInt();
for(int i = 0;i < n;i ++) a[i] = in.nextInt();
int res = 0;
//双指针算法
for(int i = 0,j = 0;i < n;i ++) {
s[a[i]] ++;
while(j < i && s[a[i]] > 1) {
s[a[j]] --;
j ++;
}
res = Math.max(res, i - j + 1);
}
System.out.println(res);
}
}
第二题 800. 数组元素的目标和
1、题目描述
给定两个升序排序的有序数组A和B,以及一个目标值x。数组下标从0开始。
请你求出满足A[i] + B[j] = x的数对(i, j)。数据保证有唯一解。
输入格式
第一行包含三个整数n,m,x,分别表示A的长度,B的长度以及目标值x。
第二行包含n个整数,表示数组A。
第三行包含m个整数,表示数组B。
输出格式
共一行,包含两个整数 i 和 j。
数据范围
数组长度不超过100000。
同一数组内元素各不相同。
1≤数组元素≤1091≤数组元素≤109输入样例:
4 5 6 1 2 4 7 3 4 6 8 9
输出样例:
1 1
2、分析
双指针:找到 i、j的单调性关系
3、代码
import java.io.*;
import java.util.*;
public class Main{
static int N = 100010;
static int[] a = new int[N];
static int[] b = new int[N];
public static void main(String[] args) {
Scanner in = new Scanner(new BufferedInputStream(System.in));
int m = in.nextInt();
int n = in.nextInt();
int x = in.nextInt();
for(int i = 0;i < m;i ++) a[i] = in.nextInt();
for(int j = 0;j < n;j ++) b[j] = in.nextInt();
//双指针:找i、j单调性
for(int i = 0, j = n - 1;i < m;i ++) {
while(j >= 0 && a[i] + b[j] > x) j --;
if(a[i] + b[j] == x) {
System.out.print(i + " " + j);
break;
}
}
}
}