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

最长无重复子数组

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

使用set完美解答

前排一些解答给了思路,但细节代码都有不少问题,在此予以重述。

1.整体思路

设置两个索引指针left和right,分别指向arr的0和1,right++向右走的过程中加入arr[i]到set,同时要判断当前set集合总是否有arr[i]的重复元素,有的话需要循环从头删除知道删到此重复元素。每次加入arr[i]到set后,判断ret结果。所以,所有arr元素都需要加入到set!但每次加入需要做查重、删除的操作,并设置ret实时获取set的最大值(即最终结果)。

2.错误判断

由于left指针设置为0,而right指针为1,我们需要考虑arr大小为空或者1时的结果。

3.容器的使用

并不要用map,用set即可,当然map也可以,但只用了键,值没用到,多少有点浪费存储资源。、

希望对你有所帮助。

整体代码如下:

public:
    /**
     * 
     * @param arr int整型vector the array
     * @return int整型
     */
    int maxLength(vector<int>& arr) {
        // write code here
        if(arr.empty()) return 0;
        if(arr.size() == 1) return 1;
        int ret=0;
        set<int> s;
        s.insert(arr[0]);
        int left=0;int right = 1;
        
        while(left<=right && right<arr.size()){
            if(s.count(arr[right])){
                while(arr[left]!= arr[right]){
                    s.erase(arr[left]);
                    left++;
                }
                left++;
            }
            s.insert(arr[right]);
            
            ret = ret<s.size() ? s.size():ret;
            right++;
        }
        return ret;
        
    }
};
全部评论

相关推荐

11-24 00:11
已编辑
广东工业大学 算法工程师
避雷深圳&nbsp;&nbsp;yidao,试用期&nbsp;6&nbsp;个月。好嘛,试用期还没结束,就直接告诉你尽快找下一家吧,我谢谢您嘞
牛客75408465号:笑死,直属领导和 hr 口径都没统一,各自说了一些离谱的被裁理由,你们能不能认真一点呀,哈哈哈哈哈😅😅😅
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
09-30 19:49
起名星人:蛮离谱的,直接要求转投销售
投递汇川技术等公司10个岗位
点赞 评论 收藏
分享
我已成为0offer的糕手:别惯着,胆子都是练出来的,这里认怂了,那以后被裁应届被拖工资还敢抗争?
点赞 评论 收藏
分享
评论
点赞
1
分享
牛客网
牛客企业服务