解题思路:
1. 边界条件1,数组长度为1,输出1
边界条件2,数组不重复,输出数组长度
2. 双指针,起始指针start_i, 和结尾指针end_i,
arr[start_i: end_i] 保证不重复
且 arr[start_i: end_i+1] 重复
3. 更新的双指针,找出最大长度
class Solution:
def _find_end_idx(self, arr, start_i, end_i, curr_i):
"""找到终点"""
end_idx = -1
tmp_set = set(arr[start_i: curr_i+1])
for i in range(curr_i+1, end_i+1):
if arr[i] in tmp_set:
end_idx = i
break
tmp_set.add(arr[i])
if end_idx == -1:
return end_i
return end_idx
def _find_start_idx(self, arr, start_i, end_i, curr_num):
"""找到起始点"""
for i in range(start_i, end_i):
if curr_num == arr[i]:
return i + 1
def maxLength(self , arr ):
# write code here
# 边界,长度为1
if len(arr) == 1:
return 1
# 边界,均无重复
if len(arr) == len(set(arr)):
return len(arr)
# 双指针
# 1. 找到第一个非重复的数组终点
end_idx, start_idx, max_len = -1, 0, -1
tmp_set = {arr[0]}
for i in range(1, len(arr)):
if arr[i] in tmp_set:
end_idx = i
max_len = i
break
tmp_set.add(arr[i])
# 2. 开始循环执行,找到起点,更新长度, 找终点
while True:
if end_idx == len(arr) - 1:
break
start_idx = self._find_start_idx(arr, start_idx, end_idx, arr[end_idx])
if start_idx > len(arr) - 1:
break
max_len = max(max_len, end_idx - start_idx + 1)
end_idx = self._find_end_idx(arr, start_idx, len(arr) - 1, end_idx)
max_len = max(max_len, end_idx - start_idx)
return max_len


京公网安备 11010502036488号