如何减少 for 循环的数量?

how do I reduce number of for loops?

提问人:nitpaxy 提问时间:2/15/2023 最后编辑:Joakim Danielsonnitpaxy 更新时间:2/16/2023 访问量:61

问:

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,这段代码效率不高,更重要的是我怎么认为是否高效。

数组 swift boolean-logic

评论

0赞 Joakim Danielson 2/15/2023
家庭作业,在线挑战?你没有提到如何解决这个问题有什么限制吗?另外,你自己尝试过什么吗?
0赞 nitpaxy 2/15/2023
这是我的面试问题,如果我写的那个,我的解决方案,但面试官希望我改进代码。
0赞 Joakim Danielson 2/15/2023
好的,我明白了。所以当时没有限制,底部的文字是反馈。
0赞 nitpaxy 2/15/2023
是的,这就是反馈..
1赞 vacawama 2/15/2023
三个 for 循环就可以了。您只需要 1) 避免多次选择相同的元素,2) 避免多次检查同一个三元组,3) 找到解决方案后立即返回。@HangarRash的解决方案解决了这三个问题。

答:

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-1sumOf
0赞 HangarRash 2/16/2023
@vacawama 刚刚更新以包含添加优化。
0赞 HangarRash 2/16/2023
@CosmicTea 如果所有值都为 1 或更高,您应该能够删除所有大于或等于的值。sumOf-2