$$\color{red}{算法}\color{blue}{基础课}\color{purple}{笔记and题解}\color{green}{汇总}$$
笔记:
双指针是个重要的东西(但我笔记中这玩意儿最少。。。)。
核心思想:只要$i$和$j$有单调关系,它们就可以用双指针从$O(n^2)$优化到$O(n)$。
双指针算法分为两个类别:
1. 指向两个序列(归并排序)
2. 指向一个序列(快速排序)
代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int a[N], s[N];
int main() {
int n, ans = 0; cin >> n;
for (int i = 0, j = 0; i < n; i++) {
cin >> a[i]; s[a[i]]++; //读入并统计数量
while (s[a[i]] > 1) s[a[j++]]--;
ans = max(ans, i - j + 1);
}
cout << ans;
return 0;
}
严重怀疑这是桶排序
是桶,但和排序没有关系
Conan大佬,我会在不会时先看闫老师视频,第二选择就是您的题解
qaq 谢谢支持
大佬,while循环那里去重复我明白,但是他是如何保证连续的呢,比如说2 , 3 , 5 ,1
您理解错了吧,题目中连续的是区间,您这里连续的是自然数
题目的意思是选一段连续区间
我们双指针枚举的就是这段区间的左端点和右端点,同时用一个桶(就是 s 数组)统计数量
感谢感谢,是我太愚拙了