BM92 题解 | #最长无重复子数组#
最长无重复子数组
https://www.nowcoder.com/practice/b56799ebfd684fb394bd315e89324fb4
解题思路:
我自己做出来的,well done~~真棒,没有任何提示!从不知道到出现灵感,再到自己敲代码实现!!!牛逼!!
其实官网的做法,有点让人懵圈了,我自己的思路其实很简单,就是一个hashmap就够了
key 是数组的值,用于判断有没有重复的数组值;
value是数组值的坐标,用于记录重复的数组值的坐标,让下次再开始遍历时,从前面重复的数组值的下个坐标开始遍历。
同时,用一个maxSize和curSize记录当前的最大数组数就好了!
还有下面这个判断,可以优化成,一句话: maxSize = Math.max(curSize, maxSize);
if(curSize>maxSize) {
maxSize = curSize;
}
import java.util.*; public class Solution { /** * @param arr int整型一维数组 the array * @return int整型 */ //我的思路就用一个hashmap记录没有重复的数据个数 //在for循环的过程中,如果有数据了,就说明遇到重复数据了 public int maxLength (int[] arr) { if(arr == null || arr.length==0) { return 0; } if(arr.length == 1) { return 1; } int maxSize = 0; int curSize = 0; Map<Integer, Integer> map = new HashMap<>(); for(int i=0; i<arr.length; i++) { if(!map.containsKey(arr[i])) { map.put(arr[i], i); curSize++; } else { // 中途被打断记录最大值 if(curSize>maxSize) { maxSize = curSize; } // 这一步让index回到重复值的下个坐标开始再次遍历 i = map.get(arr[i])+1; curSize = 1; map.clear(); map.put(arr[i], i); } } // 如果整个数组都没有重复 // 则在这里拦截判断设置最大值 if(curSize>maxSize) { maxSize = curSize; } return maxSize; } }