题解 | #最长无重复子数组#
最长无重复子数组
http://www.nowcoder.com/practice/b56799ebfd684fb394bd315e89324fb4
使用set完美解答
前排一些解答给了思路,但细节代码都有不少问题,在此予以重述。
1.整体思路
设置两个索引指针left和right,分别指向arr的0和1,right++向右走的过程中加入arr[i]到set,同时要判断当前set集合总是否有arr[i]的重复元素,有的话需要循环从头删除知道删到此重复元素。每次加入arr[i]到set后,判断ret结果。所以,所有arr元素都需要加入到set!但每次加入需要做查重、删除的操作,并设置ret实时获取set的最大值(即最终结果)。
2.错误判断
由于left指针设置为0,而right指针为1,我们需要考虑arr大小为空或者1时的结果。
3.容器的使用
并不要用map,用set即可,当然map也可以,但只用了键,值没用到,多少有点浪费存储资源。、
希望对你有所帮助。
整体代码如下:
public:
/**
*
* @param arr int整型vector the array
* @return int整型
*/
int maxLength(vector<int>& arr) {
// write code here
if(arr.empty()) return 0;
if(arr.size() == 1) return 1;
int ret=0;
set<int> s;
s.insert(arr[0]);
int left=0;int right = 1;
while(left<=right && right<arr.size()){
if(s.count(arr[right])){
while(arr[left]!= arr[right]){
s.erase(arr[left]);
left++;
}
left++;
}
s.insert(arr[right]);
ret = ret<s.size() ? s.size():ret;
right++;
}
return ret;
}
};