给出一个数字和一个排序的双链表(数据为整数),我必须找到最长的子列表,其平均值为O(n)中的给定数字。 你会怎么做?
答案 0 :(得分:1)
首先,找到所有索引的累积总和。假设这是一个数组,cumsum[1..n]
现在,从两个指针开始,一个指向第一个节点,另一个指向最后一个节点。计算此范围的平均值为(cumsum[last]-cumsum[first])/(last-first+1)
。如果该值大于目标平均值(例如k
),则向后移动后指针,因为这将始终减小平均值(因为已对其进行排序)。同样,如果avg < k
,则将前指针向前移动。这样,您将最终得到一个平均值为k的范围(如果存在),或者意识到如果前后指针交叉,则此类k不存在。由于我们在每一步中至少移动了一个指针,所以它是O(n)。