📌  相关文章
📜  包含 0、1 和 2 的最小窗口(1)

📅  最后修改于: 2023-12-03 15:22:47.463000             🧑  作者: Mango

包含 0、1 和 2 的最小窗口

给定一个由 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)