📅  最后修改于: 2023-12-03 15:28:47.868000             🧑  作者: Mango
本文介绍题目为“门|门 CS 1999 |问题 26”的算法问题,其中包括算法介绍、解题思路、解题代码和时间复杂度分析。
题目描述如下:给定一个长度为 $n$ 的整数序列 $a_1, a_2, ..., a_n$,以及一个整数 $k$,求一个最小的正整数 $m$,使得存在一个长度为 $m$ 的连续子串,其中的不同整数个数不超过 $k$。
题目可以用滑动窗口算法来解决。
首先,定义滑动窗口的左右端点 $l$ 和 $r$,表示当前滑动窗口的范围。在滑动窗口内部维护一个哈希表 $map$,表示当前滑动窗口内不同的整数个数。
接下来,我们按如下步骤执行:
while 循环的终止条件是右端点 $r$ 到达数组边界,即 $r>n$。最终返回 $res$ 即可。
def solve(a, k):
n = len(a)
l, r = 1, 1
res, cnt = n, 0
map = {}
while r <= n:
if a[r-1] not in map:
cnt += 1
map[a[r-1]] = map.get(a[r-1], 0) + 1
while cnt > k:
map[a[l-1]] -= 1
if map[a[l-1]] == 0:
cnt -= 1
l += 1
if cnt <= k:
res = min(res, r-l+1)
r += 1
return res
滑动窗口算法的时间复杂度由两部分组成:遍历数组的时间复杂度 $O(n)$ 和维护哈希表的时间复杂度 $O(k)$,因此总的时间复杂度为 $O(nk)$。