题意:给定长度为 n 的事件序列,每个事件用一个非负整数标签表示。研究人员只关注其中的 K 种标签(分别编号为 1 到 K),并给出每种关注标签的最低出现次数 c1,c2,…,cK。要求在一段连续子序列中,每种关注标签的出现次数都不低于对应的最低要求,求满足条件的最短连续子序列长度,若不存在则输出 −1。
核心算法:双指针滑动窗口
total[x],若存在 total[x] < c[x](且 c[x]>0),则必无解,直接输出 -1。[l, r],并用 cnt[x] 统计窗口内每个标签出现次数。某实验室记录了一个长度为 n 的事件序列,每个事件用一个非负整数标签表示。研究人员只关注其中的 K 种标签(分别编号为 1 到 K),并为每种关注标签设定了一个最低出现次数 c1,c2,…,cK(均为非负整数)。
现在需要从原始事件序列中截取一段连续子序列,使得在该子序列中,每种关注标签的出现次数都至少达到各自的最低要求。请你求出满足条件的最短连续子序列的长度(即包含的事件个数)。如果不存在任何满足要求的连续子序列,则输出 −1。
约束:序列长度 n 和关注标签种数 K 均不超过 105;序列中的每个标签均为不超过 105 的非负整数;最低出现次数 ci 也为非负整数。
第一行包含两个整数 n 和 K。 第二行包含 n 个整数,依次表示序列中每个事件的标签。 第三行包含 K 个整数,依次表示 c1,c2,…,cK。
输出一个整数,表示最短满足要求的连续子序列长度;若不存在这样的子序列,则输出 −1。
输入
6 3
1 2 2 1 3 1
2 1 1
输出
4
说明
关注标签 1,2,3 分别至少需要出现 2、1、1 次。整个序列中标签 1 出现 3 次,2 出现 2 次,3 出现 1 次,总数满足要求。通过滑动窗口可以找到子序列 [2,1,3,1](位于第 2 到第 5 个事件),其中包含 2 个 1、1 个 2 和 1 个 3,长度为 4。任何长度不超过 3 的子序列都无法同时满足三种标签的需求,因此最短长度为 4。
输入
5 2
1 1 1 2 2
3 3
输出
-1
说明
关注标签 1 和 2 分别要求至少出现 3 次。在整个序列中,标签 2 只出现了 2 次,未达到要求。由于连整个序列都无法满足条件,任何子序列更不可能,因此输出 -1。
输入
4 3
9 8 7 6
0 0 0
输出
1
说明
所有关注标签的最低次数均为 0,对子序列没有任何限制。任意单个事件都可以视为满足条件的子序列,因此最短连续子序列的长度为 1。
输入
8 4
5 1 2 1 3 1 4 2
2 1 0 1
输出
5
说明
关注标签 1,2,3,4 的需求分别为 2,1,0,1。标签 3 的需求为 0,可以忽略;标签 5 是不关心的标签,也不影响判断。整个序列中 1 出现 3 次,2 出现 2 次,4 出现 1 次,总数充足。滑动窗口可得到子序列 [2,1,3,1,4](位置 2 到 6),包含 2 个 1、1 个 2 和 1 个 4,长度为 5。没有更短的子序列能满足全部需求,故答案为 5。
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册