📅  最后修改于: 2023-12-03 15:22:47.463000             🧑  作者: Mango
给定一个由 0、1 和 2 组成的数组,找到该数组中包含 0、1 和 2 的所有元素的最小子数组。 返回最小子数组的起始位置和长度。
由于需要包含 0、1 和 2,因此可以维护三个指针,分别指向最小窗口的左端点、右端点和当前扫描的位置。 在扫描数组时,如果遇到 0、1 或 2,则将对应的指针移动到当前位置。 当三个指针指向的元素都在窗口中时,更新最小窗口的起始位置和长度,并将左端点指针右移一位,缩小窗口。
时间复杂度:O(n)
def min_window(nums):
left, right, curr = 0, 0, 0
counts = [0, 0, 0]
min_len = len(nums) + 1
min_start = 0
while curr < len(nums):
counts[nums[curr]] += 1
while counts[0] and counts[1] and counts[2]:
if curr - left + 1 < min_len:
min_len = curr - left + 1
min_start = left
counts[nums[left]] -= 1
left += 1
curr += 1
if min_len == len(nums) + 1:
return None
else:
return min_start, min_len
输入: [2,0,1,1,0,2,2,1,0]
输出: (4, 3)
输入: [1,2,0]
输出: (0, 3)