1925.统计平方和三元组的数目:两层循环枚举

【LetMeFly】1925.统计平方和三元组的数目:两层循环枚举

力扣题目链接:https://leetcode.cn/problems/count-square-sum-triples/

一个 平方和三元组 (a,b,c) 指的是满足 a2 + b2 = c2 的 整数 三元组 ab 和 c 。

给你一个整数 n ,请你返回满足 1 <= a, b, c <= n 的 平方和三元组 的数目。

 

示例 1:

输入:n = 5
输出:2
解释:平方和三元组为 (3,4,5) 和 (4,3,5) 。

示例 2:

输入:n = 10
输出:4
解释:平方和三元组为 (3,4,5),(4,3,5),(6,8,10) 和 (8,6,10) 。

 

提示:

  • 1 <= n <= 250

解题方法:两层循环枚举

n的数据范围只有$250$,因此可以第一层循环用$a$从$1$到$n$枚举,第二层循环用$b$从$1$到$n$枚举。

由于第三层循环再从$1$枚举到$n$的话,最大时间复杂度可能会达到$250^3\approx1.6\times10^7$,有超时风险,

所以直接算出$a^2+b^2$的值(记为$k$),令$c=\lfloor\sqrt{k}\rfloor$,看$c$是否不超过$n$且$c^2=k$

  • 时间复杂度$O(n^2)$,开根号时间复杂度视为$O(1)$
  • 空间复杂度$O(1)$

AC代码

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/*
* @LastEditTime: 2025-12-08 18:47:09
*/
#if defined(_WIN32) || defined(__APPLE__)
#include "_[1,2]toVector.h"
#endif

class Solution {
public:
int countTriples(int n) {
int ans = 0;
for (int a = 1; a <= n; a++) {
for (int b = 1; b <= n; b++) {
int k = a * a + b * b;
int c = sqrt(k);
ans += c * c == k && c <= n;
// if (c * c == k) {
// printf("(%d, %d, %d)\n", a, b, c);
// }
}
}
return ans;
}
};

#if defined(_WIN32) || defined(__APPLE__)
int main() {
Solution sol;
cout << sol.countTriples(5) << endl;
cout << sol.countTriples(12) << endl;
return 0;
}
#endif

Python

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
'''
LastEditTime: 2025-12-08 18:53:01
'''
from math import sqrt

class Solution:
def countTriples(self, n: int) -> int:
ans = 0
for a in range(1, n + 1):
for b in range(1, n + 1):
k = a * a + b * b
c = int(sqrt(k))
ans += c <= n and c * c == k
# if c <= n and c * c == k:
# print(f"({a}, {b}, {c})")
return ans

# a = Solution()
# print(a.countTriples(5))

Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/*
* @LastEditTime: 2025-12-08 18:59:47
*/
class Solution {
public int countTriples(int n) {
int ans = 0;
for (int a = 1; a <= n; a++) {
for (int b = 1; b <= n; b++) {
int k = a * a + b * b;
int c = (int)Math.sqrt(k);
if (c <= n && c * c == k) {
ans++;
}
}
}
return ans;
}
}

Go

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/*
* @LastEditTime: 2025-12-08 18:57:02
*/
package main

import "math"

func countTriples(n int) (ans int) {
for a := 1; a <= n; a++ {
for b := 1; b <= n; b++ {
k := a * a + b * b
c := int(math.Sqrt(float64(k)))
if c <= n && c * c == k {
ans++
}
}
}
return
}

Rust

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/*
* @LastEditTime: 2025-12-08 21:55:06
*/
impl Solution {
pub fn count_triples(n: i32) -> i32 {
let mut ans: i32 = 0;
for a in 1..n+1 {
for b in 1..n+1 {
let k = a * a + b * b;
let c = (k as f64).sqrt() as i32;
if c <= n && c * c == k {
ans += 1;
}
}
}
ans
}
}

End

I am back

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源


1925.统计平方和三元组的数目:两层循环枚举
https://blog.letmefly.xyz/2025/12/08/LeetCode 1925.统计平方和三元组的数目/
作者
发布于
2025年12月8日
许可协议