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

最长无重复子数组

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

用set记录元素值;用l、r记录左右下标;
如果arr[r]存在于set;那就饿在set中删除arr[l]到arr[r]

class Solution {
public:
    /**
     * 
     * @param arr int整型vector the array
     * @return int整型
     */
    int maxLength(vector<int>& arr) {

        if(arr.empty())
            return 0;
        if(arr.size()==1)return 1;
        //init
        map<int,int> map;            // value-index
        set<int>st;
        //set.erase()
        int left = 0;
        int right = 0;
        map[arr[0]] = 0;
        int maxLength = 0;           //记录最大连续不重复子序列长度

        while(left<=right && right<arr.size()){    //[left,right]

            if(st.count(arr[right]))//if(st.find(arr[right]!=st.end))
            {
                //从left删除至与arr[right]等值元素
                while(arr[left]!=arr[right]){
                    st.erase(arr[left]);
                    ++left;
                }
                ++left;
                st.erase(left);//加不加无所谓//为什么呢?
            }
            //加入arr[right]
            st.insert(arr[right]);//已经存在就不会再添加
            maxLength = maxLength<st.size()? st.size():maxLength;
            ++right;
        }
        return maxLength;
    }
};
全部评论

相关推荐

不愿透露姓名的神秘牛友
06-12 18:53
点赞 评论 收藏
分享
收到了小米的实习offer,犹豫是否要去。。。
认真搞学习:雷总还当过首富呢,公司不算大厂算独角兽吗
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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