【发布时间】:2017-05-04 06:01:04
【问题描述】:
问题:给定一个大小为 N 的数组,打印具有连续元素的大小为 K 的已排序子集。
N = 10, K = 4
8 4 7 5 1 10 3 9 2 6
Output:
4 5 7 8, 1 4 5 7, 1 5 7 10, 1 3 5 10, ...
方法1:对所有子集进行排序并打印。
复杂性分析:
复制K个元素:O((N - K + 1) * (K)) //子集的数量*子集的大小
排序子集:使用STL,排序子集的最坏情况时间是O(K log K)。
因此,O((N - K + 1) * (K) + (N - K + 1) * (K log K))
方法 2:从输出序列来看,连续子集相差 2 个元素。因此对于第二个子集,删除第一个元素,在正确的位置插入第K+1个元素。
复杂性分析:
创建第一个子集:K
删除和插入 - 线性搜索(是否应该优化!):K
因此,O(K + (N - K + 1) * (K))
我想知道第二种方法是否更快?有显着的收获吗?是否值得不使用 STL 实现?这可以进一步改善吗?还有其他方法吗?以及对 STL 容器实施的任何建议。
【问题讨论】:
-
第二种方法,你可以使用二分查找,虽然插入和删除仍然需要O(k)时间