【发布时间】:2020-04-06 09:09:51
【问题描述】:
我想要一个给定 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,所以不需要处理无效的情况。
【问题讨论】:
-
你的意思是 N
-
可能有帮助:Split a random value into four that sum up to it——同样的问题,但没有每个数字最多为 N 的限制。
-
是的,对不起,n
-
@MartinR 有很大的不同,恕我直言......
-
“随机数组”是什么意思?所有可能的数组都应该同样可能吗?你用这个干什么?