题目描述:
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.
算法分析:
在本题中,为了找出第n个ugly number,很明显我们需要从前面已经获得的ugly number中来构建。在已经获得的ugly number中的数,或者乘以2、或者乘以3、或者乘以5,然后从中找出一个最小的,并且之前没有计算得到的数,即是第n个ugly number。如果我们采用遍历的方式,算法的复杂度是O(n^2),这不是我们想要的。我们可以通过下面的方式来获得一个O(n)复杂度的算法。
我们用数组dp来保存前n个ugly number,再设置三个初始值均为0的变量i,j,k。在构建第n+1个ugly number时,我们从dp[i]*2,dp[j]*3,dp[k]*5这三个数中找出一个最小值,即是第n+1个ugly number了,并更新相应的i或者j或者k的值。即如果选出的是dp[i]*2,则i++,如果是dp[j]*3,则j++。代码实现如下:
int nthUglyNumber(int n)
{
vector<int> dp;
dp.push_back(1);
int i=0,j=0,k=0;
while (dp.size()<n)
{
dp.push_back(min(dp[i]*2, min(dp[j]*3,dp[k]*5) ) );
if (dp.back()==dp[i]*2)
i++;
if (dp.back()==dp[j]*3)
j++;
if (dp.back()==dp[k]*5)
k++;
}
return dp.back();
}