通过在每一步增加相邻节点,找到使所有树节点为零所需的最小值

时间:2019-03-27 03:02:58

标签: algorithm tree nodes

  1. 问题在于找到使所有节点均为零所需的最小值,我们称其为K。

  2. 给出了一个非二进制数字树。

  3. 在第一步中,您可以选择一个节点作为起点。如果K大于该节点的值,则将该值更改为零,并增加相距一到两个距离的其他节点的值。请注意,一旦节点的值变为零,就不会再增加它,也不会允许与其连接的节点增加。

  4. 然后,您应该选择另一个在距离1处具有至少一个零值节点的节点,然后重复该过程

示例:

5
 \
  2 
   \
    5

当我们从值5的叶子开始时,我们有

6
 \
  3
   \
    0

那么我们应该选择3;我们不能选择6,因为它在距离1中没有零节点!

7
 \
  0
   \
    0

最后,我们选择7并且K = 7,但是如果首先选择2,则我们有:

6
 \
  0
   \
    6

那么我们应该选择6;因为现在值为2的节点为零,所以连接被切断,并且通过更改值为6的节点的值,将不再发生增量!

0
 \
  0
   \
    6

所以最小K = 6

我目前的做法:

  1. 找到最大节点并从其开始(如果有多个最大节点,则选择较早的那个)

  2. 我定义一个数组,我们称其为可能的节点,然后向其中添加在步骤1中找到的节点。

  3. 可能的节点不为空时,我执行以下步骤:

    a。在可能的节点中选择最大值;我们称之为 max_node

    b。使 max_node 的功率为零并更新K

    c。增加其父母,祖父母,子女,孙子女和兄弟姐妹(如果之前不为零)的值

    d。将其非零值的父项和子项添加到可能的节点

    e。从可能的节点

  4. 中删除 max_node

实际上这是一个家庭作业问题,但是这种方法不正确!它给出了错误的答案并达到了超时限制。

约束

  • ≤3×10 5

  • 的节点数
  • -10 9 ≤节点的值≤10 9

  • 时间限制:2.5秒

  • 内存限制:256 MB

1 个答案:

答案 0 :(得分:0)

如果您从树中的随机节点开始,则K为以下各项的最大值:

  1. 起始节点
  2. 其子女+ 1
  3. 其父母+ 1
  4. 所有其他节点+ 2

这是因为限制,您只能选择与0节点相邻的节点,并且这些节点不能递增。

我们可以得出结论,Kmin必须在max和max + 2之间。

因此O(n)算法看起来像这样:

  1. 找到最大节点值max并计算有多少节点具有该值=> maxCount
  2. 如果maxCount = 1然后计算有多少个节点具有值max - 1 => max1Count,则有两种可能性:
    1. max1Count = 0或与值为max - 1的节点相邻的值为max的节点数等于max1Count =>解为max < / li>
    2. 否则解决方案为max + 1
  3. 在树中找到最高值为max的所有节点:
    1. 如果您发现max第一次出现的深度只有一个节点:
      1. 值为max的孩子数等于maxCount - 1 =>解为max + 1
      2. 只有一个值为max的孩子,并且其值为max的孩子数等于maxCount - 2 =>解决方案也是max + 1
      3. 没有子代的值max,但是有maxCount - 1个大子代,它们的父代和值都max =>解决方案也是max + 1
      4. 否则解决方案为max + 2
    2. 如果找到了maxCount个节点,并且它们都具有相同的父==,则解决方案是max + 1
    3. 否则解决方案为max + 2