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;
}
}