Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 双链表查找最接近平均值的元素 有一个强的排序的双链表(C++ STL STD::列表),例如“1,1,2,3,4,5,6”,如何通过扫描一次找到最接近列表平均值的元素(最近的元素平均22/7为3)< /P> < P>这里的关键是它是一个双链表。_Algorithm - Fatal编程技术网

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)avgR,那么你将如何操作,继续从L向左扫描1)并继续从R向右扫描2)?@JavaBeta如果
avg
,只需返回
L-1
L
之间更接近平均值的一个。如果
avg>R
,则对
R
R+1
执行相同操作。你只需要回顾/向前看一个立场,因为“为什么这样做”下提供的论点。我的例子有一些问题,avg实际上大于1,但它可以解释我的怀疑。@FilipeGonçalves不,我认为这是不可能的。