1. 程式人生 > 其它 >雙指標演算法和位運算

雙指標演算法和位運算

雙指標演算法

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