您的位置:首页 > Web前端

剑指offer 49 丑数

2020-07-09 10:19 316 查看

我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。
解:对于这道题的理解;这里的质因子指的是一个数的约数,并且是质数;把一个合数写成几个质因数的乘积的形式,即求质因数的过程叫做分解质因数;

任何一个丑数都是由小于它的某一个丑数2,3,5,得到的,如何得到所有的丑数?
现在假设由三个数组:分别是:
A:{12,22,32,42,52,62…};
B:{13,23,33,43,53,63…};
C:{15,25,35,43,53,6*3…};
所有丑数的排列就是上面的数组合并结果然后去重得到的,就相当于转换成三个有序数组的合并问题;
合并有序数组的比较好的方式就是给每一个数组设置一个指针,然后比较这些指针中所指的哪个数最小,就将这个结果放到这个结果数组中,然后该指针后移一位;
时间复杂度为O(n),空间复杂度为O(n),用来存放丑数

public int nthUglyNuber(int n){
if(n==0) return 0;
int[] ugly=new int[n];
ugly[0]=1;
int i=0,j=0,k=0;
for(int idx=0;idx<n;idx++){
int temp=Math.min(ugly[i]*2,Math.min(ugly[j]*3,ugly[k]*5));
if(temp==ugly[i]*2) i++;
if(temp==ugly[j]*3) j++;
if(temp==ugly[k]*5) k++;
ugly[idx]=temp;
}
return ugly[n-1];
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: