【发布时间】:2015-02-15 22:50:36
【问题描述】:
有没有比这个例子更好的方法来从一个列表中找到三个在scala中总和为零的数字?现在,我觉得我的函数方式可能不是最有效的,它包含重复的元组。在我当前的示例中,消除重复元组的最有效方法是什么?
def secondThreeSum(nums:List[Int], n:Int):List[(Int,Int,Int)] = {
val sums = nums.combinations(2).map(combo => combo(0) + combo(1) -> (combo(0), combo(1))).toList.toMap
nums.flatMap { num =>
val tmp = n - num
if(sums.contains(tmp) && sums(tmp)._1 != num && sums(tmp)._2 != num) Some((num, sums(tmp)._1, sums(tmp)._2)) else None
}
}
【问题讨论】:
-
我认为更有效的策略之一...是 1) 对列表进行排序。 2)添加最大和最小的数字......使用二进制搜索搜索第三个数字(使得 sum == 0)。如果总和为 0,则保存该元组。否则...将这两个二进制搜索数字(总和超过 0)作为第二个数字。使用二分搜索检查。坚持下去……
标签: scala