题解 | #最长无重复子数组#
最长无重复子数组
https://www.nowcoder.com/practice/b56799ebfd684fb394bd315e89324fb4
import java.util.*; public class Solution { /** * * @param arr int整型一维数组 the array * @return int整型 */ public int maxLength (int[] arr) { // write code here //首先跟个数有关,需要利用HashMap,里面记录的是元素,和当前元素对应的索引值 //记录子数组的起点start和终点i // 利用res记录下最长的情况 HashMap<Integer,Integer> hm = new HashMap<>(); int res = 0; int start = 0; for(int i = 0; i< arr.length;i++){ if(hm.containsKey(arr[i])){ //如果元素已经在hashMap里面,存在两种可能 // 1.重复的元素已经在无重复子数组左边,不影响,不用换起点 // 2.重复添加的元素在无重复子数组的里面,需要缩小当前的子数组,换起点 start = Math.max(start,hm.get(arr[i]) + 1); } //元素不在里面,加入到hashMap,并且加入它对应的索引值 hm.put(arr[i],i); // 每次比较之前记录的最大值和当前子数组的长度 res = Math.max(res,i-start+1); } return res; } }
首先,因为无重复,判断是否重复用HashMap。然后是最长的子数组,用res记录最长的情况。每次要比较更新它。
如果重复的部分,是小于start的,也就是hm.get(arr[i]) 是小于start,那边start还是原来的
如果重复部分在数组里面,需要更换起点,也就是hm.get(arr[i])是大于start的,更换起点为 hm.get(arr[i)+1
这两种情况,可以直接用max函数合并
然后不重复的部分,就执行put完事儿,并且更新res,比较res和i-start的情况
感觉这一题还是很巧妙