双指针算法和位运算

双指针算法

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

posted @ 2021-11-10 17:35  xmubaron  阅读(31)  评论(0)    收藏  举报