題目描述:
給定乙個長度為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...