开启我的LeetCode刷题日记:1447. 最简分数

186 阅读2分钟

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

编程世界总是离不了算法

最近在看框架源码时,会有很多算法的实现逻辑,有时候会感到吃力

于是决定蹭着假期,加强算法和数据结构相关的知识

那怎么提升呢?

其实我知道算法这东西没有捷径,多写多练才能提升,于是我开启我的LeetCode刷题之旅

第一阶段目标是:200道,每天12

为了不乱,本系列文章目录分为三部分:

  1. 今日题目:xxx
  2. 我的思路
  3. 代码实现

今天题目:1447. 最简分数

难度:中等

给你一个整数 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 输出:[]

我的思路

  • 使用Set来判断当前分数是否是最简,因为若不是最简的,分数的值在之前肯定出现过了
  • 暴力遍历所有01到分数,将最简分数加入res即可

代码实现

const simplifiedFractions = n => {
  // 使用set判断是否最简分数
  // 因为若不是最简,他们的比值之前肯定出现过
  const set = new Set();
  const isSimple = (a, b) => {
    // 比值出现过,不是最简
    if (set.has(a / b)) return false;
    set.add(a / b);
    // 是最简
    return true;
  };

  const res = [];
  for (let i = 2; i <= n; i++) {
    for (let j = 1; j <= i - 1; j++) {
      // 暴力遍历,若是最简,放入res
      if (isSimple(j, i)) {
        res.push(`${j}/${i}`);
      }
    }
  }

  return res;
};


总结

实现方式其实有很多,这里仅供参考~

由于刚开始刷题,也不知道从哪里刷好,如果前辈们有好的建议,希望不吝赐教,感谢🌹