【问题标题】: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) 复杂度的近似算法:
- 对列表进行降序排序(复杂度 O(n log-n));
- 将排序列表中的项目放在两堆中,以便在放置每个项目时,两个列表之和之间的差异最小化(复杂度 O(n))。
复杂度(2^n)的精确解:
- 使用从 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);
}
}