美文网首页
NC41 最长无重复子数组

NC41 最长无重复子数组

作者: Abeants | 来源:发表于2021-10-18 19:16 被阅读0次

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

    数据范围:0\le |arr| \le 10000000≤∣arr∣≤1000000,0 < arr_i \le 1000000<arr
    i

    ≤100000
    要求:空间复杂度 O(n)O(n),时间复杂度 O(nlogn)O(nlogn)
    示例1
    输入:
    [2,3,4,5]
    复制
    返回值:
    4
    复制
    说明:
    [2,3,4,5]是最长子数组
    示例2
    输入:
    [2,2,3,4,3]
    复制
    返回值:
    3
    复制
    说明:
    [2,3,4]是最长子数组
    示例3
    输入:
    [9]
    复制
    返回值:
    1
    复制
    示例4
    输入:
    [1,2,3,1,2,3,2,2]
    复制
    返回值:
    3
    复制
    说明:
    最长子数组为[1,2,3]
    示例5
    输入:
    [2,2,3,4,8,99,3]
    复制
    返回值:
    5
    复制
    说明:
    最长子数组为[2,3,4,8,99]

    解题思路及方法

    运用了队列先进先出的方法,把元素不停的入队,当队列里有重复的元素时,就把队首的元素出队,一直到没有重复元素为止。这样就可以保证队列内部永远都没有重复的元素。

    import java.util.*;
    
    
    public class Solution {
        /**
         * 
         * @param arr int整型一维数组 the array
         * @return int整型
         */
        public int maxLength (int[] arr) {
            // write code here
            Queue<Integer> queue = new LinkedList<>();
            // 记录当前无重复元素子数组的长度
            int maxLen = 0;
            for (int num : arr) {
                // 如果队列含有重复元素,队首出队一直到队列没有重复元素
                while (queue.contains(num)) {
                    queue.poll();
                }
                queue.offer(num);
                maxLen = Math.max(maxLen, queue.size());
            }
            
            return maxLen;
        }
    }
    

    结果如下:

    相关文章

      网友评论

          本文标题:NC41 最长无重复子数组

          本文链接:https://www.haomeiwen.com/subject/yjdvoltx.html