LeetCode -- 最长无重复子数组

797 阅读2分钟

今天是记录leetcode刷题的第七天,不知不觉刷题已经七天了,现在对于一些简单/中等题已经能熟练地手撸代码了,当然,仅限于我熟悉的那些算法,还有好多算法并不是很熟练,接下来就需要补充自己的短板了。

几天的题目是:最长无重复子数组,算是个不难的题吧。

题目要求如下:

给定一个长度为n的数组arr,返回arr的最长无重复元素子数组的长度,无重复指的是所有数字都不相同。

子数组是连续的,比如[1,3,5,7,9]的子数组有[1,3],[3,5,7]等等,但是[1,3,7]不是子数组.

遇到这种问题,是否重复啊,长度啊,等等的基本就要考虑一下常用数据结构了,下面提供了两种数据结构。

  • HashMap,
  • 队列

这里我们不考虑栈的原因是,我们需要在碰到重复数组时,将前面的重复字符出栈处理,但是栈是先进后出的结构,处理起来比较麻烦,所以我们不考虑栈。

HashMap和队列的实现类似,这里我们使用队列实现。

解体的思路大致就是

1、首先判断,当前数字是否在队列里,如果不在就放到队列尾部

2、如果在,我们就需要逐一弹出前面的数字直到弹出与当前数字相等的数字后停止,然后将此数字放到队列尾部

3、在进行上述处理的时候,在每次入栈时都要记录一下当前队列长度以及最大长度。

4、最后返回最大长度即可。

代码如下

public int maxLength (int[] arr) {
    // write code here
    int len = arr.length;
    if(len == 0 || len == 1){
        return len;
    }
    Deque<Integer> deque = new ArrayDeque<>();

    int length = 0,maxLen = 0;
    for (int i : arr) {

        if (!deque.contains(i)){
            length++;
        }else {
            while (deque.poll() != i) {
                length--;
            }
        }
        deque.offer(i);
        maxLen = Math.max(length,maxLen);
    }
    return maxLen;
}

代码与描述略有误差,需要自己去琢磨一下。