在O(n)中的排序双链表中找到具有给定平均值的最长子列表

时间:2019-05-27 20:53:43

标签: java doubly-linked-list

给出一个数字和一个排序的双链表(数据为整数),我必须找到最长的子列表,其平均值为O(n)中的给定数字。 你会怎么做?

1 个答案:

答案 0 :(得分:1)

首先,找到所有索引的累积总和。假设这是一个数组,cumsum[1..n]

现在,从两个指针开始,一个指向第一个节点,另一个指向最后一个节点。计算此范围的平均值为(cumsum[last]-cumsum[first])/(last-first+1)。如果该值大于目标平均值(例如k),则向后移动后指针,因为这将始终减小平均值(因为已对其进行排序)。同样,如果avg < k,则将前指针向前移动。这样,您将最终得到一个平均值为k的范围(如果存在),或者意识到如果前后指针交叉,则此类k不存在。由于我们在每一步中至少移动了一个指针,所以它是O(n)。