【问题标题】:Have a single list of Integers and need to divide it into two separate lists where the sum of the integers in both lists are equal or close to equal有一个整数列表,需要将其分成两个单独的列表,其中两个列表中的整数之和相等或接近相等
【发布时间】:2015-02-15 09:49:34
【问题描述】:

我是计算机科学领域的新手。我希望能在该领域找到我的第一份工作。这是旧金山的 Salesforce 实习,我被要求解决这个问题。我不确定从哪里开始。任何帮助或只是指出我正确的方向将不胜感激。谢谢你,节日快乐。

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

【问题讨论】:

标签: algorithm list arraylist


【解决方案1】:

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

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

复杂度(2^n)的精确解:

  1. 使用从 0 到 2^n 的每个整数的位作为位掩码 包含在列表 1 中,详尽地测试每个可能的分配 两个集合的列表成员。

【讨论】:

    【解决方案2】:

    这是一个愚蠢的简单解决方案,可能会接近最佳答案,但不能保证。这是一个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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多