C++ 代码
#include <iostream>
using namespace std;
const int N = 100010;
int a[N], count[N];
int n, ans;
int main() {
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
for (int i = 0, j = 0; j < n; j++) {
count[a[j]] ++;
while (count[a[j]] > 1) {
count[a[i]] --;
i++;
}
ans = max(ans, j - i + 1);
}
printf("%d", ans);
return 0;
}
- 时间复杂度:使用双指针的题目一般都是$O(n)$
- 空间复杂度:标记数组占内存比较大,数组长度为数据范围上界,其实完全可以用哈希表代替,这样优化后额外的空间复杂度就是$O(n)$
感谢图解!很清晰!分享个人看了楼主图解后,对while循环的理解:
图来
脑婆脑婆
你们的那个图都是哪里画的啊?
同问
同问
平板
感觉像vision
个人理解:
为方便表述,记 最长连续不重复子序列 为C,
[i, j]表示当前C,长度是j - 1 + 1。
j指针用于遍历数组a,当发生重复,一定是a[j]与前面的a[k]相等,其中i <= k <= j - 1。
若发生重复,用i指针来清除[i, k]范围内的数组a的值在数组count中的标记,确保数组count只记录[i, j]即当前C中出现的数字。
由于无从得知这个C的起始下标和结束下标,因此每轮循环对ans的值与当前C的长度j - 1 + 1取max。
握草原来还可以这样子去重,太厉害了
第二个分号行:count[a[i]]——结束后,此时它为1,种终止while循环
图解好清晰,看一下就会写了昂
佬,想问下为什么在输入时
cin >> a[i];count[a[i]] ++
记录次数会wa,在遍历时记录次数acorz
nb老哥
很棒
你是我的神!
鼠太感谢您的图解了
感谢,真的很好理解
代码题解能看懂,自己写到是什么也不会了
截图留名,感谢大佬
借图
借图
大佬,图怎么画的,教教我
真的很nice,我自己看了两个小时,看了你这个图,10分钟就懂了,你真的是我的神!!!