剑指offer 49 丑数

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

任何一个丑数都是由小于它的某一个丑数2,3,5,得到的,如何得到所有的丑数?
现在假设由三个数组:分别是:
A:{1
2,2
2,3
2,42,52,62…};
B:{1
3,23,33,43,53,63…};
C:{1
5,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];
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值