最长无重复子数组极简实现——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)
京公网安备 11010502036488号