找到数组中包含数组中所有元素的最短范围

时间:2017-09-15 01:19:39

标签: c++ arrays

考虑一个可以包含非不同整数的数组A [],如何找到覆盖数组中所有元素的最短范围?

A[]  =  7 3 1 7 3 1 3 4 1
index=  0 1 2 3 4 5 6 7 8


范围[3,7]中的元素形成阵列中存在的最短范围 因此,答案必须是5.
如何使用双指针解决此问题?
P.S .:这个问题来自任何现场比赛 我的尝试:我已经采用了一个变量len,我会从1到数组的长度变化,并且每个len检查它是否涵盖所有元素。

1 个答案:

答案 0 :(得分:2)

我们的数组长度为N,区别元素的数量为KK<=N。 我们假设值为01,...,K-1。 (我们可以对所有元素进行排序,然后使用0替换具有最小值的元素,使用1替换具有第二最小值的元素等,然后将它们放回原始位置。它需要{{1}复杂性。)

创建一个数组O(N*log(N),其中C[K]应该在一个C[i]段中保留值为i的元素的数量。 让[x, y]成为细分中的一些不同元素。

如果我们通过增加D来扩展此类细分,我们会将y增加一。 如果C[A[y+1]]变为C[A[y+1]],我们会1增加D

如果我们通过增加1来缩小细分,我们会将x减少一个。 如果C[A[x+1]]变为C[A[x+1]],我们会将0减少D

所以,如果1我们知道该段包含所有元素。

现在从D==K开始并继续扩展该段,直到它包含所有可能的值。嘿,它是[0, 0]。 然后收缩它,同时结果段仍然包含具有所有可能值的元素。设为[0, q]

[p, q]向右移动一个位置,即移至[p, q]。 再次尝试缩小细分。等

因此,粗略地说,将片段从左向右移动,并尝试在每一步上缩小它。当你到达终点并且不能再移动左端时,你就完成了。它是[p+1, q+1]。所以一起(包括排序):O(N)