最长无重复子数组极简实现——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)