基础双指针算法:单队列、双队列

1、单队列

例1:将字符串以换行符间隔开

输入一串字符串,字符串有多个由单个逗号隔开的单词,
任务是需要把单词间隔开,每个单词换行输出。

输入样例
abc def ghi

输出样例
abc

def

ghi

#include <iostream>
using namespace std;

const int N = 1010;

int main() {
    char str[N];
#define gets(str) gets_s(str)
    gets(str);
    
    int n = strlen(str);
    for (int i = 0, j = 0; i < n;) {
        while (j < n && str[j] != ' ') j++;

        for (int k = i; k < j; k++) {
            cout << str[k];
        }

        cout << endl;

        i = j + 1;
        j++;
    }

    return 0;
}

 

例2:以AcWing.799为例,题目要求如下:

题目描述
给定一个长度为n的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。

输入格式
第一行包含整数n。

第二行包含n个整数(均在0~100000范围内),表示整数序列。

输出格式
共一行,包含一个整数,表示最长的不包含重复的数的连续区间的长度。

数据范围
1≤n≤100000,

输入样例
5
1 2 2 3 5
输出样例
3

#include <iostream>
using namespace std;

const int N = 1e5 + 10;
int q[N], s[N];

int main() {
    int n, ans = 0;
    cin >> n;
    for (int i = 0; i < n; i++) scanf("%d", &q[i]);
    
    for (int i = 0, j = 0; i < n; i++) {
        s[q[i]]++;

        while (j <= i && s[q[i]] > 1) {
            s[q[j]]--;
            j++;
        }
        
        ans = max(ans, i - j + 1);
    }

    cout << ans << endl;
    return 0;
}

 

2、双队列:略,可参考归并排序

posted @ 2023-09-25 11:56  karinto  阅读(49)  评论(0)    收藏  举报