所以我试图将int数组拆分成两个数组,数组之和的差异最小。有没有人有任何想法我该怎么办?或者任何提示?
F.e。
int[] S = { 1, 1, 3, 6 };
我们可以将S
数组拆分为
int[] a = {1,1,3};
和
int[] b = {6};
数组a
和为5,数组b
和为6,因此最小差值为1.顺便说一下,我试图获得S
的拆分数组a
和b
,而不是总和差异。
输入:
int[] S = { 1, 1, 3, 6 };
输出:int[] a = {1,1,3};
和int[] b = {6};
。这就是我想要做的事情。
到目前为止,我已尝试Link
问题解决了!谢谢大家的帮助!
答案 0 :(得分:2)
你提供的link是一个比你向我们展示的更复杂的问题。在您的示例中,元素不能“重新排序”,因此您只能将数组细分为两部分。你只需要选择“切割”的位置。
var array = new int[] { 1, 1, 3, 6 };
int leftSum = 0;
int rightSum = 0;
for (int i = 0; i < array.Length; i++)
{
rightSum += array[i];
}
int leftArraySize = 0;
int minDiff = rightSum;
for (int i = 0; i < array.Length; i++)
{
rightSum -= array[i];
leftSum += array[i];
int diff = Math.Abs(rightSum - leftSum);
if (diff < minDiff)
{
minDiff = diff;
leftArraySize = i + 1;
}
}
var leftArray = new int[leftArraySize];
var rightArray = new int[array.Length - leftArraySize];
Array.Copy(array, 0, leftArray, 0, leftArray.Length);
Array.Copy(array, leftArray.Length, rightArray, 0, rightArray.Length);
简单代码,没有Linq:你有两个“总和池”,leftSum
和rightSum
。您在rightSum
池中汇总了数组的所有元素。然后逐个元素将“rightSum
总和”中的一个元素“移动”到leftSum
总和。然后检查两个“总和池”之间的差异是否为最小值。然后,您只需将元素复制到两个新数组中。
答案 1 :(得分:1)
int[] values = new int[] { 1, 2, 3, 4, 5, 6 };
int minIndex = -1;
int minDiff = int.MaxValue;
for (int i = 0; i < values.Length; i++)
{
int p1 = 0;
for (int j = 0; j <= i; j++)
p1 += values[j];
int p2 = 0;
for (int k = i + 1; k < values.Length; k++)
p2 += values[k];
int diff = Math.Abs(p1 - p2);
if (diff < minDiff)
{
minIndex = i;
minDiff = diff;
}
}
Console.WriteLine("Min index = " + minIndex);
Console.WriteLine("Min difference = " + minDiff);