264. 丑数 II
贴个题目:
贴个示例:
解题思路:
这道题目,默认第一个丑数是1,那么其实就是使用动态规划,让每一位乘2、3、5,并且选取其中的最小值。
那么我们就定义三个指针,p2、p3、p5分别代表质因数2、3、5,下一个丑数就是当前指针指向丑数乘对应的质因数得到的。
意思就是说,如果你这一次指针选择了乘2,那么p2就要向下一位
类推,若这一次指针选择了乘3,那么p3就要向下一位
若这一次指针选择了乘5,那么p5就要向下一位
最后return 最后一个就好
贴个代码:
int nthUglyNumber(int n){
int dp[n+1];
dp[1]=1;
int p2=1;
int p3=1;
int p5=1;
for(int i=2;i<=n;i++)
{
dp[i]=fmin(dp[p2]*2,fmin(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];
}
性能分析:
时间分析:
由于是遍历一次,因此时间复杂度是:O(n)
空间分析:
新建了一个长度为n+1的数组,因此空间复杂度是:O(n)