IT评测·应用市场-qidao123.com

标题: LeetCode 1447 最简分数 [打印本页]

作者: 大连密封材料    时间: 2025-3-12 20:41
标题: LeetCode 1447 最简分数
0 到 1 之间的最简分数求解(Java 实现)

一、标题描述

给定整数 n,返回全部满足以下条件的分数:

示例
输入 n = 4,输出 ["1/2", "1/3", "1/4", "2/3", "3/4"]
二、焦点思路分析

1. 数学本质

最简分数的焦点条件是 分子与分母互质(最大公约数 GCD 为 1)。
遍历全部大概的分母 d(2 ≤ d ≤ n),对每个分母遍历分子 n(1 ≤ n < d),判断 gcd(n, d) == 1。
2. 遍历策略


3. 关键算法

使用欧几里得算法高效盘算 GCD(时间复杂度 O (log min (a,b))):
gcd(a, b) = b == 0 ? a : gcd(b, a % b)
三、Java 代码实现

  1. import java.util.ArrayList;
  2. import java.util.List;
  3. class Solution {
  4.     public List<String> simplifiedFractions(int n) {
  5.         List<String> result = new ArrayList<>();
  6.         for (int denominator = 2; denominator <= n; denominator++) { // 分母从2开始
  7.             for (int numerator = 1; numerator < denominator; numerator++) { // 分子小于分母
  8.                 if (gcd(numerator, denominator) == 1) { // 互质条件
  9.                     result.add(numerator + "/" + denominator);
  10.                 }
  11.             }
  12.         }
  13.         return result;
  14.     }
  15.     private int gcd(int a, int b) { // 欧几里得算法
  16.         return b == 0 ? a : gcd(b, a % b);
  17.     }
  18. }
复制代码
四、复杂度分析

维度时间复杂度空间复杂度时间O(n² log n)解释双重循环遍历 n² 次,每次 GCD 盘算 O (log n)存储结果的空间 O (k),k 为符合条件的分数数量空间O(k)k ≤ n (n-1)/2(最坏环境全互质) 五、测试用例

输入 n输出数量典范结果(部分)10[]21["1/2"]45["1/2", "1/3", "1/4", "2/3", "3/4"]1027包含 "1/10" 到 "9/10" 的 27 个互质分数 六、细节说明

七、优化扩展(欧拉函数)

当 n 极大(如 n=10^5)时,可预处理欧拉函数 φ(d)(表示小于 d 且与 d 互质的数的个数),减少 GCD 盘算次数:
  1. // 欧拉函数优化(适合n>1000)
  2. private List<String> eulerOptimization(int n) {
  3.     int[] phi = new int[n + 1];
  4.     Arrays.fill(phi, 0);
  5.     phi[1] = 1;
  6.     for (int i = 2; i <= n; i++) {
  7.         if (phi[i] == 0) { // i是质数
  8.             for (int j = i; j <= n; j += i) {
  9.                 if (phi[j] == 0) phi[j] = j;
  10.                 phi[j] = phi[j] / i * (i - 1); // 欧拉函数公式
  11.             }
  12.         }
  13.     }
  14.     List<String> res = new ArrayList<>();
  15.     for (int d = 2; d <= n; d++) {
  16.         int count = phi[d];
  17.         for (int n = 1, c = 0; c < count; n++) { // 直接遍历互质分子
  18.             if (gcd(n, d) == 1) {
  19.                 res.add(n + "/" + d);
  20.                 c++;
  21.             }
  22.         }
  23.     }
  24.     return res;
  25. }
复制代码
八、总结


适用场景

通过本题可以巩固:

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4