Problem: AcWing 799. 最长连续不重复子序列
文章目录
- 思路
- 解题方法
- 复杂度
- Code
思路
这是一个求最长连续不重复子序列的问题。我们可以使用双指针(滑动窗口)的方法来解决。我们维护一个窗口,并使用一个数组来记录窗口内元素的出现次数。当窗口右端的元素在窗口内出现次数大于1时,我们就移动窗口的左端,直到窗口内所有元素都不重复。在这个过程中,我们记录下窗口的最大长度,这就是我们要找的最长连续不重复子序列的长度。
解题方法
我们使用两个指针i和j,分别表示窗口的左端和右端。初始时,i和j都指向序列的第一个元素。然后我们向右移动j,增大窗口,直到窗口内有重复元素。此时,我们开始向右移动i,缩小窗口,直到窗口内没有重复元素。在这个过程中,我们记录下窗口的最大长度,这就是我们要找的最长连续不重复子序列的长度。
复杂度
时间复杂度:
O ( n ) O(n) O(n),其中n是序列的长度。我们只需要遍历一次序列。
空间复杂度:
O ( n ) O(n) O(n),我们需要一个长度为n的数组来记录窗口内元素的出现次数。
Code
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;public class Main {static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));static StreamTokenizer sr = new StreamTokenizer(in);static int MAXN = (int) (1e5 + 10);static int n;static int[] arr = new int[MAXN];static int[] s = new int[MAXN];public static void main(String[] args) throws IOException {n = nextInt();for (int i = 0; i < n; i++) {arr[i] = nextInt();}int ans = 0;for(int i = 0, j = 0; j < n; j++) {s[arr[j]]++;while(s[arr[j]] > 1) {s[arr[i++]]--;}ans = Math.max(ans, j - i + 1);}out.println(ans);out.flush();}static int nextInt() throws IOException {sr.nextToken();return (int) sr.nval;}}