给定一个长度为 n 的非负整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。
一般做法:
- 对于 i∈[0, n − 1]i\in\lbrack0,\;n\;-\;1\rbracki∈[0,n−1]) ,找到整数序列中以iii为区间右端点的最长的不包含重复元素的连续区间,得到其长度kik_iki。
- k = max{ ki ∣ i∈[0, n−1] }k\;=\;max\{k_{i\;}\vert\;i\in\lbrack0,\;n-1\rbrack\;\}k=max{ ki∣i∈[0,n−1]}
简化型代码
int k = 0;
for(int i = 0; i < n; i++){
for(int j = 0; j < i; j++){
if(!check(j, i)){
//check(j, i)是检查区间[j, i]内是否存在重复元素,如果存在,则返回true, 否则,返回false。
k = max(k, i - j + 1); //k为最大长度
break;
}
}
}
改良版
上述代码实现时出现的问题:
当 iii 改变了,jjj 的值要从0开始遍历,这一点大可不必。观察下图:
假如,此时区间