题目描述
题目链接:https://leetcode-cn.com/problems/ugly-number-ii/
Write a program to find the n-th ugly number.
Ugly numbers are positive numbers whose prime factors only include 2, 3, 5. For example, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 is the sequence of the first 10 ugly numbers.
Note that 1 is typically treated as an ugly number, and n does not exceed 1690.
解题思路
题目要求我们找到给定的第n个丑数。
最简单的想法是不断遍历每个正整数,判断它是不是丑数。一直统计,直到它达到n个。这种方法虽然直观,但是在leetcode OJ 上会报超时。
我们尝试新的思路。
(2) 1×2, 2×2, 3×2, 4×2, 5×2, …
(3) 1×3, 2×3, 3×3, 4×3, 5×3, …
(5) 1×5, 2×5, 3×5, 4×5, 5×5, …
一个新的丑数可以看做是一个旧的丑数乘以2,3,5得到的(第一个丑数是1,第二个为2,则第二个可以看做第一个丑数2得到了第二个丑数(12、13和15中的最小者)),本题解题难点在于维护丑数数列为从小到大排列的顺序。
根据上述思路可以做如下实现:
维护三个列表l2,l3,l5,分别是当前处理的丑数num的2,3,5倍,因此三个列表组内均是遵从从小到大排列的规则;
每次获得三个列表的第一个结点(最小的结点)最为当前丑数num,根据当前丑数值想三个列表末端插入新的较大的丑数值,等待后续处理;
若列表的第一个结点与当前丑数num相等,则删除列表第一个结点(表示该丑数已经被计数);
题目的初始条件为num = 1, count = 1;
程序实现
class Solution {
public int nthUglyNumber