题解 | #最长无重复子数组#
最长无重复子数组
http://www.nowcoder.com/practice/b56799ebfd684fb394bd315e89324fb4
import java.util.*;
public class Solution {
/**
*
* @param arr int整型一维数组 the array
* @return int整型
*/
public int maxLength (int[] arr) {
HashSet<Integer> set = new HashSet<Integer>();//记录某个时刻窗口内的元素,方便查找(用hashmap也行)
set.add(arr[0]);//起始时,窗口大小为1,内容为数组首个元素
int l = 0, r = 0, max_subarr_len = 1;//l指向窗口左边界, r指向窗口右边界, max_subarr_len记录最大的窗口值.
while(r<arr.length-1){
//根据下一个元素调整窗口大小
if(!set.contains(arr[r+1])){//下一个元素不在子数组里
set.add(arr[r+1]);
r++;//扩大窗口右边界
}else{//下一个元素已经在子数组里存在
while(arr[l]!=arr[r+1]){//缩小窗口直到找到重复的元素
set.remove(arr[l]);
l++;//缩小窗口左边界
}
l++;//需要多缩小窗口左边界一次,因为此时l刚好指向重复的元素
r++;//扩大窗口右边界
}
//比较并记录窗口大小
if(r-l+1 > max_subarr_len){
max_subarr_len = r-l+1;
}
}
return max_subarr_len;
}
}
滑动窗口法:
思路:
- 每次将窗口右侧扩大一个元素, 比较新元素和窗口内存在的其他元素: 若无重复,继续扩大窗口; 若有重复,则将窗口左侧收缩直到重复元素被去除;
- 每次操作完成后比较当前窗口和已知最大窗口大小, 若当前窗口更大则更新最大窗口大小;
三奇智元机器人科技有限公司公司福利 95人发布