LeetCode算法实战 1447.最简分数

301 阅读3分钟

「这是我参与2022首次更文挑战的第19天,活动详情查看:2022首次更文挑战」。

题目描述

给你一个整数 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

题目分析

阅读完题目描述,我们可以知道题目要求的是要我们找出所有分母小于等于n的最简真分数,再看一下题目给的提示,n的数据范围为1~100,这个数据量并不大,所以我们可以直接枚举分母小于n的真分数,然后再判断一下该分数是否为最简分数,是最简分数的话就将其放进结果集合。写代码之前我们还需要了解两个比较简单的概念:

最简分数

什么是最简分数,最简分数的定义是分子、分母只有公因数1的分数,或者说分子和分母互质的分数,又称既约分数。如:二分之一,三分之二,九分之八,八分之三等等。

最大公因数

最大公因数,也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个。a,b的最大公约数记为(a,b),同样的,a,b,c的最大公约数记为(a,b,c),多个整数的最大公约数也有同样的记号。求最大公约数有多种方法,常见的有质因数分解法、短除法辗转相除法更相减损法。与最大公约数相对应的概念是最小公倍数,a,b的最小公倍数记为[a,b]。 求解最大公因数的方法有很多,有兴趣的同学可以都去了解一下,这里我主要介绍一下辗转相除法。

辗转相除法

辗转相除法也叫欧几里得算法,用辗转相除法求几个数的最大公约数,可以先求出其中任意两个数的最大公约数,再求这个最大公约数与第三个数的最大公约数,依次求下去,直到最后一个数为止。最后所得的那个最大公约数,就是所有这些数的最大公约数。 写成代码如下:

gcd = function(x,  y) {
    while(x != 0 && y != 0){
        let s = parseInt(x) + parseInt(y);
        x = Math.max(x,y);
        y = s - x;
        x %= y;
    }
    return y;
}

代码

/**
 * @param {number} n
 * @return {string[]}
 */
var simplifiedFractions = function(n) {
    let gcd = function(x,  y) {
        while(x != 0 && y != 0){
            let s = parseInt(x) + parseInt(y);
            x = Math.max(x,y);
            y = s - x;
            x %= y;
        }
        return y;
    }
    let res = [];
    for(let i = 1; i < n; i++){
        for(let j = i + 1; j <= n; j++){
            if(gcd(i,j) == 1) res.push(i + '/' + j);
        }
    }
    return res;
};