Algorithm 双链表查找最接近平均值的元素 有一个强的排序的双链表(C++ STL STD::列表),例如“1,1,2,3,4,5,6”,如何通过扫描一次找到最接近列表平均值的元素(最近的元素平均22/7为3)< /P> < P>这里的关键是它是一个双链表。
你需要做的是同时从两边开始,一边走一边计算平均值 如果到目前为止的平均值大于右迭代器的元素,则增加左迭代器 如果平均值小于左迭代器的元素,则减少右迭代器 如果平均值介于两者之间,则向内移动一个或两个(假设向左移动一个) 当迭代器相遇时,停止。查看当前元素,一个元素向后,一个元素向前,以查看哪个元素最近 为什么这样做:Algorithm 双链表查找最接近平均值的元素 有一个强的排序的双链表(C++ STL STD::列表),例如“1,1,2,3,4,5,6”,如何通过扫描一次找到最接近列表平均值的元素(最近的元素平均22/7为3)< /P> < P>这里的关键是它是一个双链表。,algorithm,Algorithm,你需要做的是同时从两边开始,一边走一边计算平均值 如果到目前为止的平均值大于右迭代器的元素,则增加左迭代器 如果平均值小于左迭代器的元素,则减少右迭代器 如果平均值介于两者之间,则向内移动一个或两个(假设向左移动一个) 当迭代器相遇时,停止。查看当前元素,一个元素向后,一个元素向前,以查看哪个元素最近 为什么这样做: 1,1,2,3,4,5,6 Average L R 7/2 = 3.5 L R 8/3 = 2.667 L R
1,1,2,3,4,5,6 Average
L R 7/2 = 3.5
L R 8/3 = 2.667
L R 10/4 = 2.5
L R 13/5 = 2.6
L R 18/6 = 3
L R 22/7 = 3.14
LR
如果平均值小于左边的值,它可以保持较小的值,因此元素(或左边的一个位置)可能是最近的,因此我们不能移动迭代器
如果平均值大于左值,因为所有尚未处理的元素都大于左值,所以平均值不可能降到左值以下,因此我们可以安全地增加左迭代器。更严格地说,左边的值仍然可以是最接近的,但不是左边一个位置的值(这就是为什么我们需要查看周围的元素)。以下面增加3到4为例
同样,对于正确的值
示例:
1,1,2,3,4,5,6 Average
L R 7/2 = 3.5
L R 8/3 = 2.667
L R 10/4 = 2.5
L R 13/5 = 2.6
L R 18/6 = 3
L R 22/7 = 3.14
LR
然后看看3、4和5,我们发现3是最接近的。重要吗?2*n仍然是O(n)这是一个面试问题,面试官说名单很长,所以他可能希望只扫描一次。回答很酷。让你的论点更清楚的一种方法是运用归纳法。您的参数/不变量可能类似于“设D为双链表,设L和R为指针。在算法中的任何一点上,L点在D[i]处,R点在D[j]处,我们有一个不变量,即L[i]或L[i-1]是迄今为止最接近R[j]或R[j+1]的平均值且对称。”。最后你要检查三个元素,L[i-1],L[i]=R[j],R[j+1.我知道你是如何操作的,我还有一个问题:当L和R相遇时,有三种情况:1)avg
avg
,只需返回L-1
或L
之间更接近平均值的一个。如果avg>R
,则对R
和R+1
执行相同操作。你只需要回顾/向前看一个立场,因为“为什么这样做”下提供的论点。我的例子有一些问题,avg实际上大于1,但它可以解释我的怀疑。@FilipeGonçalves不,我认为这是不可能的。