【发布时间】:2016-08-03 10:52:23
【问题描述】:
我想找到可以将数组划分为 2 个非空部分的次数,以使左侧分区中的元素之和等于右侧分区中的元素之和。
每次成功分区后,我们丢弃左分区或右分区,并使用剩余的分区作为数组继续播放。
最初,有一个数组,a,包含 N 个整数。 N <= 2^14
static int Compute(int[] a, int arraySize)
{
return ComputeNumberOfPartition(a.ToList(), arraySize, 0);
}
static int ComputeNumberOfPartition(List<int> a, int N, int points)
{
List<int> left = new List<int>();
List<int> right = new List<int>();
for (int i = 0; i < N; ++i)
{
if (sum(left) <= sum(right)) { left.Add(a[i]); }
else { right.Add(a[i]); }
}
if (sum(left) == sum(right))
{
return left.Count >= right.Count ?
ComputeNumberOfPartition(left, left.Count, ++points) :
ComputeNumberOfPartition(right, right.Count, ++points);
}
return points;
}
static int sum(List<int> a)
{
int sum = 0;
for (int i = 0; i < a.Count; ++i)
{
sum += a[i];
}
return sum;
}
例如:
input1 3 3 3
output1 0
我们不能分成两部分,总和相等。因此,她的最大可能得分为 0。
input2 4 1 0 1 1 0 1
output2 3
我的解决方案很慢。我们怎样才能更有效地解决它? 这个问题来自hackerrank
【问题讨论】:
-
当您说
split时,您的意思是与原始数组只能有一个分隔符吗?所以如果a = [ 1, 2, 3, 4, 5, 6 ],就不能像b = [ 2, 3, 4 ], c = [ 1, 5, 6 ]一样拆分? -
如果它有效 -> Codereview 它
-
还有输入数组是什么样的?任意数字?
-
@HubertGrzeskowiak 最初,有一个数组 A ,其中包含 N 个整数。 N
-
@Fabjan 请阅读从
After each successful partition ..开始的问题