题目:
求数列中最长不重复子序列长度
双指针:
快慢指针i和j,i负责遍历数组中的每个元素,j指针负责对应i指针指向的元素对应的最长不重复子串的开始元素。
我们的每个字串就说a[i]~a[j].
res不断更新取最大的a[i]对应的最长字串长度即可
max_length = max(max_length, i - j + 1);
关键代码解读:
for (int i = 0, j = 0; i < n; i++)
{
s[a[i]]++;
while (j < i && s[a[i]] > 1)
{
s[a[j++]]--;
}
max_length = max(max_length, i - j + 1);
}
s数组记录每个元素出现的次数,当个数>1的时候s[a[i]]>1
,意味着a[i]这个元素重复出现了,此时说明a[j]~a[i]这个区间已经有重复的元素了,不重复子序列
a[j]~a[i-1]已经告一段落了,我们要寻找下一个不重复子序列了,即更新j指针和a[j]对应的s数组。
完整代码:
#include <iostream>
using namespace std;
const int N = 1e5 + 10;
int a[N], s[N];
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i++)
cin >> a[i];
int max_length = 0;
for (int i = 0, j = 0; i < n; i++)
{
s[a[i]]++;
while (j < i && s[a[i]] > 1)
{
s[a[j++]]--;
}
max_length = max(max_length, i - j + 1);
}
return 0;
}