【每日一题】【集合增删】2022年1月13日-NC41 最长无重复子数组-220113/220122

描述

给定一个长度为n的数组arr,返回arr的最长无重复元素子数组的长度,无重复指的是所有数字都不相同。
子数组是连续的,比如[1,3,5,7,9]的子数组有[1,3],[3,5,7]等等,但是[1,3,7]不是子数组
 
数据范围:0\le arr.length \le 10^60arr.length1060 < arr[i] \le 10^50<arr[i]105
要求:空间复杂度 O(n)O(n),时间复杂度 O(nlogn)O(nlogn)

方法1:双层循环,加入set,有重复看下一个

import java.util.*;


public class Solution {
    /**
     * 
     * @param arr int整型一维数组 the array
     * @return int整型
     */
    public int maxLength (int[] arr) {
        if(arr.length == 0) {
            return 0;
        }
        int maxLen = 0;
        for(int i = 0; i < arr.length; i++) {
            Set<Integer> set = new HashSet<>();
            set.add(arr[i]);
            for(int j = i + 1; j < arr.length; j++) {
                if(set.contains(arr[j])) {
                    break;
                }
                set.add(arr[j]);
            }
            maxLen = Math.max(maxLen, set.size());
        }
        return maxLen;
    }
}

方法2:双指针优化(一层循环+一个指针),在循环内对指针进行变更

import java.util.*;


public class Solution {
    /**
     * 
     * @param arr int整型一维数组 the array
     * @return int整型
     */
    public int maxLength (int[] arr) {
        if(arr.length < 2) {
            return arr.length;
        }
        int maxLen = 0;
        Set<Integer> set = new HashSet<>();
        int left = 0;
        for(int i = 0; i < arr.length; i++) {
            //循环移除直到不包含当前元素
            while(set.contains(arr[i])) {
                set.remove(arr[left++]);
            } 
            set.add(arr[i]);
            maxLen = Math.max(maxLen, i - left + 1);
        }
        return maxLen;
    }
}

 方法3:用一个集合保存无重复的元素--2022年1月22日更新,最简单

public int maxLength (int[] arr) {
        int maxLen = 0;
        List<Integer> list = new ArrayList<>();
        for(int i = 0; i < arr.length; i++) {
            while(list.contains(arr[i])) {
                list.remove(0);
            }
            list.add(arr[i]);
            maxLen = Math.max(maxLen, list.size());
        }
        return maxLen;
    }

 

posted @ 2022-01-13 12:07  哥们要飞  阅读(32)  评论(0编辑  收藏  举报