-1

我有一个编码挑战,我需要完成,并且已经在这里搜索解决方案或任何其他建议,但无法找到任何建议。

这是挑战:“平衡点”是可以拆分值数组列表的点,以便一侧的数字总和等于另一侧的数字总和。(平衡点包含在“第二个”子列表中。)给定一个非空整数列表,返回平衡点,如果给定列表不存在平衡点,则返回 -1。

balance_point([1, 1, 1, 2, 1]) → 3
balance_point([2, 1, 1, 2, 1]) → -1
balance_point([10, 10]) → 1

我想将列表分成两部分并对每个单独的部分求和,然后比较总和。但是,我怎么知道在哪里拆分列表?以及如何从左侧和右侧对这些数字求和?

任何帮助将不胜感激!

4

1 回答 1

0

基本情况:如果列表的大小小于 2,则返回 -1

设置

  • 设 s R是右子列表的总和,R是列表n-1中最后一项的索引。将 s R设置为索引n-1处的项目的值
  • 让 s L是左子列表的总和,L是列表0中第一项的索引。将 s L设置为索引0处的项目的值

算法:

  1. 如果s R < s L AND R-1大于L,则将索引R-1处的值添加到 s R并将R设置为R-1

  2. 如果s L < s R AND L+1小于R,则将索引L+1处的值添加到 s L并将L设置为L+1

  3. 如果s L = s R AND L+1小于R-1,则将 R 设置R -1并将L设置为L+1,然后重复步骤 1-2

  4. 重复步骤 1-3,直到所有条件都为假

回答:

如果 s L = s R,则返回R,否则返回-1

于 2017-08-06T07:47:41.417 回答