Вот несколько разных (лучше?) Способов получить один и тот же результат (по сути, один и тот же).
Если вы хотите, чтобы все пары индексов, чьи значения суммировались с целью.
def twoSum(nums :Array[Int], target :Int) :Iterator[Seq[Int]] =
nums.indices
.combinations(2)
.filter{case Seq(a,b) => nums(a) + nums(b) == target}
twoSum(Array(3,5,11,2,13,9), 41) //returns empty Iterator
twoSum(Array(3,5,11,2,13,9), 14) //returns Iterator(Seq(0, 2), Seq(1, 5))
Если вы хотите получить только первую пару, которая суммируется с целью (с досрочным прекращением).
def twoSum(nums :Array[Int], target :Int) :Option[Seq[Int]] =
nums.indices
.combinations(2)
.find{case Seq(a,b) => nums(a) + nums(b) == target}
twoSum(Array(3,5,11,2,13,9), 41) //returns None
twoSum(Array(3,5,11,2,13,9), 14) //returns Some(Seq(0, 2))
Если вы хотите избежать Option
и просто вернуть пустую коллекцию, если нет двух значений, сумма в цель.
def twoSum(nums :Array[Int], target :Int) :Seq[Int] =
nums.indices
.combinations(2)
.find{case Seq(a,b) => nums(a) + nums(b) == target}
.getOrElse(Seq())
twoSum(Array(3,5,11,2,13,9), 41) //returns Seq()
twoSum(Array(3,5,11,2,13,9), 14) //returns Seq(0, 2)