1. 程式人生 > 其它 >演算法基礎 (11)雙指標

演算法基礎 (11)雙指標

技術標籤:演算法演算法java

給定一個長度為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); } }