美文网首页
IOS 算法(中级篇) ----- 统计平方和三元组的数目

IOS 算法(中级篇) ----- 统计平方和三元组的数目

作者: ShawnAlex | 来源:发表于2021-07-14 16:20 被阅读0次

    一个 平方和三元组 (a,b,c) 指的是满足 a2 + b2 = c2 的 整数 三元组 a,b 和 c 。
    给你一个整数 n ,请你返回满足 1 <= a, b, c <= n 的 平方和三元组 的数目。
    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 遍历法

    由于数目比较小, 1 <= n <= 250, 可以采用for循环遍历方式

    n < 5 不存在, 直接报错(最小: n = 5 即 3, 4, 5)
    n > 5, 遍历 a, b, c 在 3 ~ n范围内 (其实1 ~ n也可以, 只不过多走几次循环判断)
    找到满足a ^ 2 + b ^ 2 = c ^2, 的a, b, c 结果res + 2
    因为: a, b 可以互换下位置, c最大位置固定, 循环结束返回结果

    未翻译版
        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 }
    
            // 定义结果res
            var res = 0
    
            // 循环 a, 范围 3 ~ n-1, 其实如果不做n < 5判断, 这里从1开始循环也行
            for a in 3..<n-1 {
             
                // 循环 b, 范围 a+1 ~ n-1, 这里为什么三者不会相等, 
                // 其实 2 * a^2 = c^2, 两边开方 c = 根号2 * a, 根号2 = 1.414..., 固相等比不满足
                for b in a+1..<n {
                    
                    // 循环 a, 范围 3 ~ n-1, 其实如果不做n < 5判断, 这里从1开始循环也行
                    for c in b+1...n {
    
                        // 如果有 a * a + b * b == c * c 则满足
                        if a * a + b * b == c * c {
                            // res = res + 2, 因为a, b 可以互换位置, C最大位置固定不变, 即2种情况
                            res += 2
                        }
                    }
                }
            }
            
            // 返回res
            return res
        }
    

    当然我们也可以减少一次循环

    定义ca * a + b * b 的开方进行判断

        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 的开方数`
                    let c = Int(sqrt(Double(a * a + b * b)));
                    // 这里留意下 c 毕竟是转成double再转int会有误差
                    // 所以这里要加个 c * c == a * a + b * b判断
                    if c <= n && c * c == a * a + b * b  {
                            res += 2
                    }
                }
            }
            
            return res
        }
    
    

    题目来源:力扣(LeetCode) 感谢力扣爸爸 :)
    IOS 算法合集地址

    相关文章

      网友评论

          本文标题:IOS 算法(中级篇) ----- 统计平方和三元组的数目

          本文链接:https://www.haomeiwen.com/subject/njbypltx.html