Я хочу, чтобы функция с данными N: Int и K: Int возвращала длину массива N, элементы от 1 ... N и общую сумму K. Так что для пример: для n == 3 и k == 7 решений: [3, 1, 3], [3,3,1], [3,2,2] ... Мое наивное решение:
func arrayWith(n: Int, k : Int) -> [Int] {
let elements = (1...n).map { $0 } // We only allow 1,2,3.... till n
var output = [Int]()
repeat {
output.removeAll()
for _ in 0..<n {
let validNumbers = elements.filter { $0 + output.reduce(0,+) <= k }
if let random = validNumbers.randomElement() {
output.append(random)
} else {
break
}
}
} while output.count != n || output.reduce(0,+) != k
return output
}
Это решение просто работает, но сложность по времени слишком высока. arrayWith (n: 7, k: 49) (только возможность [7,7,7,7,7,7,7], занимает секунды.)
Обратите внимание, что N, поэтому его не нужно обрабатывать недействительные случаи.