Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
题目分析
给你一个整数 n ,请你找出并返回第 n 个 丑数 。
丑数 就是只包含质因数 2、3 和/或 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