思想:把一个$n$^2的操作变成一个O(n)的操作
先写一个朴素算法,看i和j是否存在单调关系,如果存在,可以优化成O(n)
如何证明是否存在单调性呢,通常用反证法证明,以最长不连续重复子序列为例
为什么下面模板是O(n)呢,很重要一点是j<=i
这个限制存在,导致j从头到尾
只会执行n次,i也是执行n次,所以这里是+,不是,复杂度为O(2N)
两重循环为啥是O($n$^2),因为每次j都会被重置为0;
通用模板
//check函数是检查i,j是否满足题目要求
for(int i=0,j=0;i<n;i++)
{
while(j<=i&&check(i,j)) j++;
统计答案
}
经典题目:最长连续不重复子序列
给定一个长度为 n 的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。
**输入格式**
第一行包含整数 n。
第二行包含 n 个整数(均在 0∼1e5 范围内),表示整数序列。
**输出格式**
共一行,包含一个整数,表示最长的不包含重复的数的连续区间的长度。
**数据范围**
1≤n≤1e5
输入样例:
5
1 2 2 3 5
输出样例:
3