[路飞] 53——leetcode - 264. 丑数 II

134 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

264. 丑数 II

题目分析

给你一个整数 n ,请你找出并返回第 n 个 丑数 。

丑数 就是只包含质因数 23 和/或 5 的正整数。

思路讲解

此题解法同第K个数

  • 首先声明几个变量,是用来记录每个素因子的使用次数
  • 接着遍历N次,每次进行素因子相乘,取最小值
  • 最后进行去重,如果有重复的数,就在当前素因子,使用次数上+1

示例

示例 1:
输入:n = 10
输出:12
解释:[1, 2, 3, 4, 5, 6, 8, 9, 10, 12] 是由前 10 个丑数组成的序列。

示例 2:
输入:n = 1
输出:1
解释:1 通常被视为丑数。

代码

/*
 * @Autor: frllk
 * @Description: 
 * @Date: 2022-02-10 11:08:49
 * @LastEditors: frllk
 * @LastEditTime: 2022-03-29 23:22:58
 * @FilePath: \frllk-studybook\算法\week5\264.丑数-ii.js
 */
/*
 * @lc app=leetcode.cn id=264 lang=javascript
 *
 * [264] 丑数 II
 */

// @lc code=start
/**
 * @param {number} n
 * @return {number}
 * 注意这个里面的去重,与 面试题 17.09. 第 k 个数 一样
 */
var nthUglyNumber = function(n) {
  var dp = new Array() // 定义一个数组,存丑数
  dp[0] = 1
  var p2 = 0; // 素因子2使用的次数
  var p3 = 0; // 素因子3使用的次数
  var p5 = 0; // 素因子5使用的次数
  for (let i = 1; i < n; i++) {
    dp[i] = Math.min(dp[p2] * 2, Math.min(dp[p3] * 3, dp[p5] * 5))
    // 去重
    if (dp[i] === dp[p2] * 2) p2++
    if (dp[i] === dp[p3] * 3) p3++
    if (dp[i] === dp[p5] * 5) p5++
  }
  return dp[n - 1]
};
// @lc code=end