最长无重复子数组极简实现——8行

方法1:主要借助列表的in属性,内部属性更快,自己手写查找会超时。借助index属性可以直接跳到重复元素后,提升速度。双指针,如果不在子数组内,右边扩张,如果在子数组内,左边跳到重复元素后。

class Solution:
    def maxLength(self , arr: List[int]) -> int:
        i = j = max_len = 0
        while j < len(arr):
            if arr[j] not in arr[i:j]:
                j += 1
            else:
                i += arr[i:j].index(arr[j])+1   # 直接跳到重复值后面,避免重复计算
                max_len = max(max_len, j-i)
        return max(max_len, j-i)

方法2:用哈希表可以大幅提升查找速度,由于只需要存键,所以用set。双指针,如果不在哈希表内,右边扩张,如果在哈希表内,左边收缩。

class Solution:
    def maxLength(self , arr: List[int]) -> int:
        i = j = max_len = 0
        elems = set()
        while j < len(arr):
            while arr[j] in elems:
                max_len = max(max_len, j-i)
                elems.remove(arr[i])
                i += 1
            elems.add(arr[j])
            j += 1 
        return max(max_len, j-i)