AcWing 799 最長連續不重複子序列

2021-09-27 03:36:46 字數 1090 閱讀 6270

題目描述:

給定乙個長度為n的整數序列,請找出最長的不包含重複數字的連續區間,輸出它的長度。

輸入格式

第一行包含整數n。

第二行包含n個整數(均在0~100000範圍內),表示整數序列。

輸出格式

共一行,包含乙個整數,表示最長的不包含重複數字的連續子串行的長度。

資料範圍

1≤n≤100000

輸入樣例:

5

1 2 2 3 5

輸出樣例:

3
分析:

隨著問題規模的增大,不含重複數字的最大連續區間的長度必然是非遞減的,而作為解的子區間要麼不變,要麼右移,可以看出解的單調性,由此考慮採用雙指標演算法。用乙個指標指向當前遍歷到的元素,也就是當前不包含重複數字區間的末尾,另乙個指標則指向區間開頭。

為了快速的知道是否某元素在區間內是否出現了超過一次,可以用雜湊表儲存每個元素出現的位置。遍歷到某元素時,若map中之前沒有該元素,則區間長度++,否則看下上次出現該元素的位置是否在區間內,也就是比較map記錄的下標是否小於區間的開頭指標,如果恰好在區間內,則更新map中當前元素的值,也就是說,對於某元素x,m[x]永遠儲存的是該元素最新出現的位置。

以樣例1 2 2 3 5為例,設res為區間長度,初始情況頭指標p,尾指標i均指向下標0,第乙個元素1加入區間,m[1]=0,res++,第二個元素2加入,m[2]=1,res++,第三個元素2加入發現m[2] = 1 > p = 0,在區間內,於是這段無重複元素的區間就結束了,更新p為重複元素2出現的後乙個位置,也就是2,同時更新計數變數res為2-1=1,此時區間內只剩2乙個元素了,i繼續右移直至最後乙個元素5,得到區間最大長度為3。

#include #include #include using namespace std;

unordered_mapum;

int main()

else

um[x] = i;

} ans = max(ans,res);

printf("%d\n",ans);

return 0;

}

最長連續不重複子序列

給定乙個長度為n的整數序列,請找出最長的不包含重複數字的連續區間,輸出它的長度。第一行包含整數n。第二行包含n個整數 均在0 100000範圍內 表示整數序列。共一行,包含乙個整數,表示最長的不包含重複數字的連續子串行的長度。1 n 100000 51 2 2 3 5 暴力 for int i 0 ...

最長連續不重複子序列

核心思路 遍歷陣列a中的每乙個元素a i 對於每乙個i,找到j使得雙指標 j,i 維護的是以a i 結尾的最長連續不重複子序列,長度為i j 1,將這一長度與result的較大者更新給result。對於每乙個i,如何確定j的位置 由於 j,i 1 是前一步得到的最長連續不重複子序列,所以如果 j,i...

最長連續不重複子序列(雙指標)

給定乙個長度為n的整數序列,請找出最長的不包含重複數字的連續區間,輸出它的長度。輸入格式 第一行包含整數n。第二行包含n個整數 均在0 100000範圍內 表示整數序列。輸出格式 共一行,包含乙個整數,表示最長的不包含重複數字的連續子串行的長度。資料範圍 1 n 100000 輸入樣例 51 2 2...