演算法基礎 (11)雙指標
阿新 • • 發佈:2021-01-24
給定一個長度為n的整數序列,請找出最長的不包含重複的數的連續區間,輸出它的長度。
輸入格式
第一行包含整數n。第二行包含n個整數(均在0~100000範圍內),表示整數序列。
輸出格式
共一行,包含一個整數,表示最長的不包含重複的數的連續區間的長度。
資料範圍
1 ≤ n ≤ 100000
輸入樣例:
5
1 2 2 3 5
輸出樣例
3
雙指標演算法分析
首先說一下雙指標演算法的應用場景
- 如果找到
i
和’j’是單調關係,那麼就可以用雙指標演算法 - 對於一個序列,用兩個指標維護一段區間
- 對於兩個序列,維護某種次序,比如歸併排序中合併兩個有序序列的操作
//雙指標演算法的模板
for (int i = 0, j = 0; i < n; i ++ )
{
while (j < i && check(i, j)) j ++;
//每道題目的具體邏輯
}
對於這道題:
- 用
i
遍歷陣列,對於遍歷過得每個元素放進計數器中,如果這個數的計數器大於了1
那麼就讓j
往後走一位並且從這個數的計數器中-1
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in) ;
int n = sc.nextInt();
int[] arr = new int[n];
int[] s = new int[100010];
for (int i = 0; i < n; i ++ ) arr[i] = sc.nextInt();
int res = 0;
for (int i = 0, j = 0; i < n; i ++ ) {
s[arr[i]] ++;
while (s[arr[i]] > 1) {
s[ arr[j]] --;
j ++;
}
res = Math.max(res, i - j + 1);
}
System.out.println(res);
}
}