5397. 最简分数

  • 难度中等
  • 本题涉及算法最大公约数 欧几里得法
  • 思路最大公约数 欧几里得法
  • 类似题型:

题目 5397. 最简分数

给你一个整数 n ,请你返回所有 0 到 1 之间(不包括 0 和 1)满足分母小于等于 n 的 最简 分数 。分数可以以 任意 顺序返回。

示例 1:

输入:n = 2
输出:["1/2"]
解释:"1/2" 是唯一一个分母小于等于 2 的最简分数。

示例 2:

输入:n = 3
输出:["1/2","1/3","2/3"]

示例 3:

输入:n = 4
输出:["1/2","1/3","1/4","2/3","3/4"]
解释:"2/4" 不是最简分数,因为它可以化简为 "1/2" 。

示例 4:

输入:n = 1
输出:[]

提示:

1 <= n <= 100

欧几里得法(辗转相除法) 通过举例说明1

举例: 105和85的最大公约数

  1. 第一轮计回算 105÷85=1…20
  2. 第二轮计算 85÷20=4…5
  3. 第三轮计算 20÷5=4
  4. 第三轮没有余数, 因此 105和85的最大公约数就是第三轮计算的被除数 5

欧几里得法(辗转相除法) 通过举例说明2

举例: 21和17的最大公约数

  1. 第一轮计回算 21÷17=1…4
  2. 第二轮计算 17÷4=4…1
  3. 第三轮计算 4÷1=4
  4. 第三轮没有余数, 因此 105和85的最大公约数就是第三轮计算的被除数 1

方法一 最大公约数

  • 解题思路
    • 先求得最大公约数
    • 通过最大公约数 是否为 1 来判断 是否为最简分数
  • 复杂度分析
    • 时间复杂度 $O(N^2)$
    • 空间复杂度 不会算 ,谁帮忙算下 ?
class Solution:
    def simplifiedFractions(self, n: int) -> List[str]:
        def gcd(a,b):
            while b:
                a, b = b, a % b
            return a
        res = []
        for i in range(2,n+1):
            for j in range(1,i):
                if gcd(i,j) == 1:
                    res.append(str(j) +'/'+str(i))
        return res