有一个整数列表,需要将它分成两个单独的列表,其中两个列表中的整数之和相等或接近相等

时间:2014-12-16 23:03:11

标签: algorithm list arraylist

我是计算机科学领域的新手。我希望能够在现场找到我的第一份工作。这是SF的Salesforce实习,我得到了这个问题。我不确定从哪里开始。任何帮助或只是指出我正确的方向将不胜感激。谢谢你和节日快乐。

问题在于: 考虑一种情况,你有一个整数列表,需要将它分成两个单独的列表,其中两个列表中的整数之和相等或接近相等。每个子列表必须至少包含一个元素。请描述解决此问题的两种方法。第一种方法应该使用准确的算法,第二种方法应该使用更快的算法。为了澄清,我们对准确方法的定义确保找到符合我们要求的最佳答案"。对于更快的解决方案,我们仍然希望您的算法在大多数时间找到正确的答案。算法不应该具有相同的Big-O表示法。

2 个答案:

答案 0 :(得分:0)

具有O(n log-n)复杂度的近似算法:

  1. 按降序对列表进行排序(复杂度O(n log-n));
  2. 将排序列表中的项目放在两个堆中,以便在放置每个项目时,最小化两个列表之和的差异(复杂度O(n))。
  3. 具有复杂性的精确解(2 ^ n):

    1. 使用0到2 ^ n的每个整数的位作为位掩码 列入清单1,详尽地测试每个可能的分配 列表成员为两组。

答案 1 :(得分:0)

这是一个针对您的问题的愚蠢的简单解决方案,可能接近最佳答案,但不能保证。这是一个c#版本,我不知道你在用它做什么语言。

我会留给你找一个能保证获得最佳答案的版本。

public void SplitLists()
{
    var numbers = new int[100];
    var ran = new Random();
    for (var i = 0; i < numbers.Length; i ++)
    {
        numbers[i] = ran.Next(10) + 1;
    }

    var list1 = new List<int>();
    var list2 = new List<int>();

    foreach (var num in numbers)
    {
        if(list1.Sum() + num < list2.Sum())
            list1.Add(num);
        else
            list2.Add(num);
    }
}