题解 | #最长无重复子数组#
最长无重复子数组
https://www.nowcoder.com/practice/b56799ebfd684fb394bd315e89324fb4
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param arr int整型vector the array
* @return int整型
*/
int maxLength(vector<int>& arr) {
// write code here
// 用两个变量来存储最长子数组的开始和结束的下标
int p1=0,p2=1;
int max=0;
set<int> temp={};
// 判断特殊情况
if(arr.size()<=1){
return arr.size();
}
// 首先添加首元素到set集合中
temp.insert(arr[p1]);
// p2从1循环到数组最后
for(;p2<arr.size();p2++){
// 如果p2位置的数据在最长子数组中已经存在
if(temp.count(arr[p2])){
// 计算和记录现在的数组的元素个数
int count=p2-p1;
//判断现在的个数和max谁大
if(max<count){
max=count;
}
// 找到那个重复元素出现的位置,将p1移动到重复元素的后一位(记录下标值)
for(int i=p1;i<p2;i++)
{
if(arr[i]==arr[p2]){
p1=i+1;
}
}
// 清空set集合中的数据,重新insert下标移动后的数组到set中
temp.clear();
for(int i=p1;i<=p2;i++){
temp.insert(arr[i]);
}
}else {
// 没有重复元素时,insert元素到set集合中
temp.insert(arr[p2]);
cout<<1;
}
}
// 如果arr中没有重复元素,for循环中就进不了第一个分支
if(max==0){
max=arr.size();
}
// 返回结果
return max;
}
};
查看15道真题和解析
汤臣倍健公司氛围 434人发布