求最长不重复子数组问题

  public int maxLength (int[] arr) {
    HashMap<Integer,Integer> map = new HashMap<>();
    int max = 1;
    for(int start = 0, end = 0; end<arr.length ; end++){
        if(map.containsKey(arr[end])){
            //重复了
            start = Math.max(start, map.get(arr[end])+1);
            //注意:这里一定要取最大的start,不然就错误了
            //为什么? 因为重复数字的索引很可能比start小
        }
        max = Math.max(max , end-start+1);
        map.put(arr[end],end);
    }
    return max;
}

如果不重复设置 最大值,通过start   end ,end一直递增,start在原地不动,将当前数字对应的在数组中的位置记录下来,放在map中,如果下次遍历end,遇到重复的数字,就将start指针移动到这个重复数字上一次出现的下一个位置!。相当于  end之前到start  永远都是不重复的。一直这么遍历,不断刷新max值即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值