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

最长无重复子数组

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

NC41 最长无重复子数组

题意分析:

找出最长的子数组的长度,要求该子数组中没有重复元素。

题解一(暴力):

找出所有的没有重复元素的子数组,然后比较他们的长度。

超时。

题解二(双指针):

我们设置两个指针left和right,表示子数组的左端点和右端点,用一个set统计left-right中所有元素。如果left-right里面没有重复元素,就要扩展left-right。right右移。

如果扩展的元素没有出现在set中,那right右移就是可行的,记录此时的长度

如果扩展的元素出现在set中,这时候就需要收缩left,将left右移,直到left-right中间没有重复元素,只要left移动到与right重复元素的下一个位置即可,原有的left-新的right这一段元素删除。

示例如下:

图片说明
图片说明

重复上面步骤,直到right移动到数组的末尾处。

int maxLength(vector<int> &arr) {
    map<int, int> m;
    int left = 0, right = 0;
    int ret = 0;
    while (right < arr.size()) {
        if (m[arr[right]] == 0) {
            m[arr[right]] = right + 1;
            ret = max(ret, right - left + 1);
        } else {
            //收缩left
            for (; left < m[arr[right]]; left++) {
                m[arr[left]] = 0;
            }
            m[arr[right]] = right + 1;
        }
        right++;
    }
    return ret;
}

map可以替换成其他的数据结构,如set,队列。

时间复杂度:

空间复杂度:

全部评论

相关推荐

写不来代码的小黑:这么小的城市能有做it的公司也不容易
点赞 评论 收藏
分享
DKS233:(1)专业技能:Java8也太旧了,最少也要了解到JDK17吧,可以参考现在SpringBoot支持的Java最低版本,熟悉mysql基本理论具体指啥,是锁这种具体原理还是分库分表这些业务场景,spring这些专业词汇,大小写要写对(全篇简历都有这个问题,显得不严谨),熟悉使用框架进行业务开发就别写了,如果要写,起码要写到框架原理部分吧,比如aop,启动原理什么的,springcloud具体指哪些模块呢,写清楚,网关还是鉴权还是什么,“改造”没必要写吧,你直接说用springcloud开发的不就行了(2)项目经历:首先格式就有大问题,时间怎么能换行呢,调整一下,响应速度那个,如果指的是将部分数据从其他数据库转到redis的提升就别写了,因为这个不算难点,redis可以写写分布式这些,比如容灾怎么实现的,数据库同步怎么做的
点赞 评论 收藏
分享
评论
9
收藏
分享

创作者周榜

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