题解 | #最长无重复子数组#
最长无重复子数组
http://www.nowcoder.com/practice/b56799ebfd684fb394bd315e89324fb4
最长无重复子数组
描述
给定一个数组arr,返回arr的最长无重复元素子数组的长度,无重复指的是所有数字都不相同。
子数组是连续的,比如[1,3,5,7,9]的子数组有[1,3],[3,5,7]等等,但是[1,3,7]不是子数组。
思路
一开始是想用Set来做,遍历数组只要set中不包含该数字就添加,否则clear,继续遍历,重新添加。记录下最多元素的数量。
运行时发现有问题,不应该从出现重复数字的位置继续添加,而应该从出现重复数字时,该数字第一次出现的索引处继续遍历,重新添加。因此需要记录下每个元素的索引位置。于是使用Map来做。
Key存放数组元素,Value存放数组索引。
从索引0处开始遍历,当map中不包含该元素时,将该元素和该索引加入到map中。若map中已经包含了该元素,则得到该元素所在的索引,从该索引开始遍历,并且clear该map。记录下map最多元素时的数量,最后返回。
public int maxLength (int[] arr) {
//安全性分析
if (arr == null) {
return 0;
}
HashMap<Integer, Integer> map = new HashMap<>();
//最大长度
int maxLength = 0;
//遍历数组
for (int i = 0; i < arr.length; i++) {
//当map中不含有该索引处的元素时
if (!map.containsKey(arr[i])) {
//记录下当前元素所在的索引
map.put(arr[i], i);
//不断更新最大长度
if (map.size()>=maxLength) {
maxLength = map.size();
}
}else {
//当map中含有该所引处的元素时,得到该索引赋值给i
i = map.get(arr[i]);
//清除map,从i索引处重新遍历
map.clear();
}
}
//返回最大值
return maxLength;
}
海康威视公司福利 1404人发布