题解 | #最长无重复子数组#

最长无重复子数组

https://www.nowcoder.com/practice/b56799ebfd684fb394bd315e89324fb4

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param arr int整型vector the array
     * @return int整型
     */
    int maxLength(vector<int>& arr) {
        // write code here

        // 用两个变量来存储最长子数组的开始和结束的下标
        int p1=0,p2=1;
        int max=0;
        set<int> temp={};
        // 判断特殊情况
        if(arr.size()<=1){
            return arr.size();
        }
        // 首先添加首元素到set集合中
        temp.insert(arr[p1]);
        // p2从1循环到数组最后
        for(;p2<arr.size();p2++){
            // 如果p2位置的数据在最长子数组中已经存在
            if(temp.count(arr[p2])){
                // 计算和记录现在的数组的元素个数
                int count=p2-p1;
                //判断现在的个数和max谁大
                if(max<count){
                    max=count;
                }

                // 找到那个重复元素出现的位置,将p1移动到重复元素的后一位(记录下标值)
                for(int i=p1;i<p2;i++)
                {
                    if(arr[i]==arr[p2]){
                        p1=i+1;
                    }
                }

                // 清空set集合中的数据,重新insert下标移动后的数组到set中
                temp.clear();
                for(int i=p1;i<=p2;i++){
                    temp.insert(arr[i]);
                }

            }else {
                // 没有重复元素时,insert元素到set集合中
                temp.insert(arr[p2]);
                cout<<1;
            }
        }
        // 如果arr中没有重复元素,for循环中就进不了第一个分支
        if(max==0){
            max=arr.size();
        }
        // 返回结果
        return max;
    }
};

全部评论

相关推荐

评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务