题解 | #最长无重复子数组#

最长无重复子数组

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的情况

感觉这一题还是很巧妙

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务