雙指標演算法和位運算
阿新 • • 發佈:2021-11-10
雙指標演算法
for (int i = 0, j = 0; i < n; i ++ )
{
while (j < i && check(i, j)) j ++ ;
// 具體問題的邏輯
}
常見問題分類:
(1) 對於一個序列,用兩個指標維護一段區間
(2) 對於兩個序列,維護某種次序,比如歸併排序中合併兩個有序序列的操作
1、最長不重複連續子序列
給定一個長度為n的整數序列,請找出最長的不包含重複數字的連續區間,輸出它的長度。
輸入格式
第一行包含整數n。
第二行包含n個整數(均在0~100000範圍內),表示整數序列。
輸出格式
共一行,包含一個整數,表示最長的不包含重複數字的連續子序列的長度。
資料範圍
1≤n≤100000
輸入樣例:
5
1 2 2 3 5
輸出樣例:
3
#include <iostream> using namespace std; const int N = 100010; int n; int q[N], s[N]; int main() { scanf("%d", &n); for (int i = 0; i < n; i ++ ) scanf("%d", &q[i]); int res = 0; for (int i = 0, j = 0; i < n; i ++ ) { s[q[i]] ++ ; while (j < i && s[q[i]] > 1) s[q[j ++ ]] -- ; res = max(res, i - j + 1); } cout << res << endl; return 0; }
位運算
求n的二進位制表示的第k位數字: n >> k & 1
返回n的最後一位1:lowbit(n) = n & -n