2021/3/30,今天做了一个听闻已久的题:丑数。题意如下:
首先判断一个数是不是丑数并不困难,让这个数一直除2,3,5直到除不尽为止,如果能除尽就是丑数。但是这个题让找第n个丑数,首先我想到的是打表,但是复杂度太高超时了。后来看了题解学习了一种做法,下一个丑数一定是之前的某一个丑数乘2,3,5乘出来的,并且是他们中最小的那一个。但是要实现这个有点困难,看了题解的代码觉得真的牛哇,具体实现看代码:
class Solution {
public:
int nthUglyNumber(int n) {
vector<int> ans(n);
ans[0]=1;
int a=0,b=0,c=0;
for(int i=1;i<n;i++)// 在已有的丑数序列上每一个数都必须乘2, 乘3, 乘5, 这样才不会漏掉某些丑数
{
int a1=ans[a]*2,b1=ans[b]*3,c1=ans[c]*5;
ans[i]=min(a1,min(b1,c1));
if(ans[i]==a1)
++a;
if(ans[i]==b1)
++b;
if(ans[i]==c1)
++c;
}
return ans[n-1];
}
};
时间复杂度O(N),空间复杂度O(N)。
参考资料
·Krahets《剑指 Offer 49. 丑数(动态规划,清晰图解)》