一個 平方和三元組 (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
}
當然我們也可以減少一次循環
定義c
為 a * 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 算法合集地址