题目地址:
https://leetcode.com/problems/simplified-fractions/
给定一个正整数 n n n,返回所有分母不大于 n n n的所有正的既约分数。
直接枚举分子和分母,当两者最大公约数是 1 1 1的时候加入答案,最大公约数可以用欧几里得算法求得。代码如下:
import java.util.ArrayList;
import java.util.List;
public class Solution {
public List<String> simplifiedFractions(int n) {
List<String> res = new ArrayList<>();
for (int i = 1; i <= n - 1; i++) {
for (int j = i + 1; j <= n; j++) {
if (gcd(i, j) == 1) {
res.add(i + "/" + j);
}
}
}
return res;
}
private int gcd(int x, int y) {
return y == 0 ? x : gcd(y, x % y);
}
}
时间复杂度 O ( n 2 log n ) O(n^2\log n) O(n2logn)(辗转相除法复杂度大致是对数级别),空间 O ( 1 ) O(1) O(1)。
C++:
class Solution {
public:
vector<string> simplifiedFractions(int n) {
vector<string> res;
for (int i = 2; i <= n; i++)
for (int j = 1; j < i; j++)
if (gcd(i, j) == 1)
res.push_back(to_string(j) + "/" + to_string(i));
return res;
}
int gcd(int a, int b) {
return b ? gcd(b, a % b) : a;
}
};
时空复杂度一样。