【刷题日记】最长无重复子数组

描述

给定一个长度为n的数组arr,返回arr的最长无重复元素子数组的长度,无重复指的是所有数字都不相同。
子数组是连续的,比如[1,3,5,7,9]的子数组有[1,3],[3,5,7]等等,但是[1,3,7]不是子数组

示例

输入:
[2,3,4,5]
返回值:
4
说明:
[2,3,4,5]是最长子数组

解题思路:
需要每次遍历的时候,对连续的数组元素长度累计,如果超过了最大值,更新这个最大值

如果遇到了重复的元素,需要将重复元素以及重复元素之前的元素全部移除,再将新的重复元素添加进结果集,在这个过程中继续判断长度是否超过限制

最后输出这个最大值,即为无重复子数组的最大值

根据描述我们可以知道需要一个结构能够灵活地移除重复元素以及重复元素之前的元素,hashmap结构可以去重;Queue双端队列也可以从队头移除元素;

但是这里,我们使用set来完成这个,注意在移除元素的时候要注意进行循环移除,因此第二个while语句的作用如下:

 public int maxLength (int[] arr) {
        // write code here
        Set<Integer> set = new HashSet<>();
        int max = 0;
        if (arr == null || arr.length ==0){
            return max;
        }
        int left =0;
        int right =0;
        while(right < arr.length) {
            while (set.contains(arr[right])) {
                set.remove(arr[left]);
                left++;
            }
            set.add(arr[right++]);
            if(set.size() > max){
                max = set.size();
            }
        }
        return max;
    }

虽然移除set的队头不一定是移除重复的那个,但是只要set集合包含这个元素,就执行循环的移除,移除成功之后注意将新的元素加入,并且更新下标

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值