将int数组拆分为两个数组

时间:2017-05-24 12:15:26

标签: c# algorithm

所以我试图将int数组拆分成两个数组,数组之和的差异最小。有没有人有任何想法我该怎么办?或者任何提示?

F.e。 int[] S = { 1, 1, 3, 6 };

我们可以将S数组拆分为

int[] a = {1,1,3};

int[] b = {6};

数组a和为5,数组b和为6,因此最小差值为1.顺便说一下,我试图获得S的拆分数组ab,而不是总和差异。

输入: int[] S = { 1, 1, 3, 6 };

输出:int[] a = {1,1,3};int[] b = {6};。这就是我想要做的事情。

到目前为止,我已尝试Link

问题解决了!谢谢大家的帮助!

2 个答案:

答案 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:你有两个“总和池”,leftSumrightSum。您在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);