IOS 算法(中級(jí)篇) ----- 統(tǒng)計(jì)平方和三元組的數(shù)目

一個(gè) 平方和三元組 (a,b,c) 指的是滿足 a2 + b2 = c2 的 整數(shù) 三元組 a,b 和 c 。
給你一個(gè)整數(shù) n ,請(qǐng)你返回滿足 1 <= a, b, c <= n 的 平方和三元組 的數(shù)目。
1 <= n <= 250

例子:

輸入:n = 5
輸出:2
解釋:平方和三元組為 (3,4,5) 和 (4,3,5) 。

輸入:n = 10
輸出:4
解釋:平方和三元組為 (3,4,5),(4,3,5),(6,8,10) 和 (8,6,10) 。

解題思路

方法1 遍歷法

由于數(shù)目比較小, 1 <= n <= 250, 可以采用for循環(huán)遍歷方式

n < 5 不存在, 直接報(bào)錯(cuò)(最小: n = 5 即 3, 4, 5)
n > 5, 遍歷 a, b, c 在 3 ~ n范圍內(nèi) (其實(shí)1 ~ n也可以, 只不過多走幾次循環(huán)判斷)
找到滿足a ^ 2 + b ^ 2 = c ^2, 的a, b, c 結(jié)果res + 2
因?yàn)? a, b 可以互換下位置, c最大位置固定, 循環(huán)結(jié)束返回結(jié)果

未翻譯版
    func countTriples(_ n: Int) -> Int {

        if n < 5 { return 0 }
        var res = 0
        for a in 3..<n-1 {
            for b in a+1..<n {
                for c in b+1...n {
                    if a * a + b * b == c * c {
                        res += 2
                    }
                }
            }
        }
        
        return res
    }
翻譯版
    func countTriples(_ n: Int) -> Int {

        // n 小于 5 直接返回0
        if n < 5 { return 0 }

        // 定義結(jié)果res
        var res = 0

        // 循環(huán) a, 范圍 3 ~ n-1, 其實(shí)如果不做n < 5判斷, 這里從1開始循環(huán)也行
        for a in 3..<n-1 {
         
            // 循環(huán) b, 范圍 a+1 ~ n-1, 這里為什么三者不會(huì)相等, 
            // 其實(shí) 2 * a^2 = c^2, 兩邊開方 c = 根號(hào)2 * a, 根號(hào)2 = 1.414..., 固相等比不滿足
            for b in a+1..<n {
                
                // 循環(huán) a, 范圍 3 ~ n-1, 其實(shí)如果不做n < 5判斷, 這里從1開始循環(huán)也行
                for c in b+1...n {

                    // 如果有 a * a + b * b == c * c 則滿足
                    if a * a + b * b == c * c {
                        // res = res + 2, 因?yàn)閍, b 可以互換位置, C最大位置固定不變, 即2種情況
                        res += 2
                    }
                }
            }
        }
        
        // 返回res
        return res
    }

當(dāng)然我們也可以減少一次循環(huán)

定義ca * a + b * b 的開方進(jìn)行判斷

    func countTriples(_ n: Int) -> Int {

        if n < 5 { return 0 }
        var res = 0
        for a in 3..<n-1 {
            for b in a+1..<n {
                // 定義`c`為 `a * a + b * b 的開方數(shù)`
                let c = Int(sqrt(Double(a * a + b * b)));
                // 這里留意下 c 畢竟是轉(zhuǎn)成double再轉(zhuǎn)int會(huì)有誤差
                // 所以這里要加個(gè) c * c == a * a + b * b判斷
                if c <= n && c * c == a * a + b * b  {
                        res += 2
                }
            }
        }
        
        return res
    }

題目來源:力扣(LeetCode) 感謝力扣爸爸 :)
IOS 算法合集地址

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容