考虑一个可以包含非不同整数的数组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
检查它是否涵盖所有元素。
答案 0 :(得分:2)
我们的数组长度为N
,区别元素的数量为K
,K<=N
。
我们假设值为0
,1
,...,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)
。