题解 | #最长无重复子数组#
最长无重复子数组
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; }