提问人:nitpaxy 提问时间:2/15/2023 最后编辑:Joakim Danielsonnitpaxy 更新时间:2/16/2023 访问量:61
如何减少 for 循环的数量?
how do I reduce number of for loops?
问:
let array = [1, 2, 3, 6, 9, 4]
let sumOf = 8
func sumOfArrayFuntion(_ array: [Int], sumOf: Int) -> Bool {
var isTrue = false
for i in 0...array.count-1 {
for j in 0...array.count-1 {
for k in 0...array.count-1 {
if array[i] + array[j] + array[k] == sumOf {
isTrue = true
}
}
}
}
return isTrue
}
sumOfArrayFuntion(array, sumOf: sumOf)
如果一个数组中的任何三个整数相加到 sumOf 变量中,函数返回 true,这段代码效率不高,更重要的是我怎么认为是否高效。
答:
2赞
HangarRash
2/15/2023
#1
不要从零开始每个循环。您浪费了大量时间检查无效组合。同时在适当的点停止每个循环。一旦你找到匹配项,你就可以回来。
我还更新了代码以减少添加的数量。
let array = [1, 2, 3, 6, 9, 4]
let sumOf = 8
func sumOfArrayFuntion(_ array: [Int], sumOf: Int) -> Bool {
guard array.count >= 3 else { return false }
for i in 0..<array.count-2 {
for j in i+1..<array.count-1 {
let sum = array[i] + array[j]
for k in j+1..<array.count {
if sum + array[k] == sumOf {
return true
}
}
}
}
return false
}
sumOfArrayFuntion(array, sumOf: sumOf)
评论
0赞
vacawama
2/15/2023
这是一个正确、有效的解决方案。它检查所有可能的三元组,避免两次选择相同的元素,并始终避免自 i<j<k 以来对同一三元组的多次检查。
1赞
vacawama
2/15/2023
您可以通过存储 i + j 部分结果来减少加法运算的次数。对大型数组进行一些计时,看看这是否会带来更快的解决方案。
0赞
CosmicTea
2/15/2023
此外,删除所有大于或等于 if 数组不包含 0 的数字。如果包含,则略高于sumOf-1
sumOf
0赞
HangarRash
2/16/2023
@vacawama 刚刚更新以包含添加优化。
0赞
HangarRash
2/16/2023
@CosmicTea 如果所有值都为 1 或更高,您应该能够删除所有大于或等于的值。sumOf-2
评论