最长无重复子数组

题目

给定一个长度为n的数组arr,返回arr的最长无重复元素子数组的长度,无重复指的是所有数字都不相同。子数组是连续的,比如[1,3,5,7,9]的子数组有[1,3],[3,5,7]等等,但是[1,3,7]不是子数组
数据范围:
0≤arr.length≤10
0<arr[i]≤10
要求:空间复杂度 O(n),时间复杂度 (nlogn)

思路

双指针遍历的暴力解法肯定是超时的,所以只能遍历一遍,要求是无重复的,那么用一个storage来存储不重复的元素,当right到i位置时候找到了一个元素和storage中是重复的,那么将这个storage中的这个重复元素和它之前的元素全部踢出,再进行添加新的元素,过程中不断更新storage的长度最大值。

代码

python代码:

#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param arr int整型一维数组 the array
# @return int整型
#
class Solution:
    def maxLength(self , arr: List[int]) -> int:
        # write code here
        length = len(arr)
        max_value = 0
        storage = []
        for i in range(length):
            if arr[i] not in storage:
                storage.append(arr[i])
            else:
                index = storage.index(arr[i])
                storage = storage[index+1:]
                storage.append(arr[i])
            max_value = max(max_value, len(storage))
        return max_value

c++代码:

class Solution {
public:
    /**
     * 
     * @param arr int整型vector the array
     * @return int整型
     */
    int maxLength(vector<int>& arr) {
        // write code here
        map<int, int> m;
        int left=0; int 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{
                for(; left<m[arr[right]]; left++){
                    m[arr[left]]=0;
                }
                m[arr[right]] = right + 1;
            }
            right++;
        }
        return ret;
    };
};
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超超爱AI

土豪请把你的零钱给我点

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值