思路:双指针法

定义两个指针left和right,分别表示滑动窗口的左右边界,初始值都为0。然后right向右移动,直到窗口中包含了所有需要看的知识点。此时,我们记录窗口大小,然后left向右移动,每次移动一格,直到窗口中不包含所有需要看的知识点,再次移动right,直到包含所有需要看的知识点……以此类推,直到right到达最后一页,此时就找到了最短的连续页数。

具体实现时,我们可以用一个unordered_map来记录每个知识点出现的次数,然后在移动窗口时,每当将某个知识点加入窗口时,将其对应的出现次数减1,表示已经有一个该知识点在窗口中了。当某个知识点的出现次数为0时,就说明窗口中已经包含了所有该知识点,可以将需要看的知识点数减1。当需要看的知识点数变为0时,就说明窗口中包含了所有需要看的知识点。

时间复杂度:O(n) 空间复杂度:O(n)

参考代码:

C++实现假设一本教材中有P页每页包含第ai个知识点知识点会有所重复现给出每页的知识点ai以及需要看的知识点数K请你求出能够看完全部1~K个知识点的最短连续页数是多少。注意本题必有解不存在不包含的知识点。输入描述3行第1行包含1个数字P代表页数的个数P。第2行包含P个数字代表教材每页中的知识点ai。第3行包含1个数字K代表需要看完的K个知识点。输出描述1行表示最少连续页数。

原文地址: https://www.cveoy.top/t/topic/fKST 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录