寻找第1500个丑数

丑数概念: 因子中只含2,3,5的数,如1,2,3,4,5,6,8,9,10....... 

14中含有除了2,3,5以外的因子7,不符合丑数概念

1被认为是第一个丑数

在此,按照自己的理解,贴上代码,供以相互交流。


//寻找第index个丑数
	private static int uglyFound(int index){
		int uglyNums[] = new int[index];
		int two=0,three=0,five=0;
		if (index<=0) return -1;
		uglyNums[0]=1;
		for(int i=1;i<index;i++){
			//寻找在序列中,比最后一个数小,两倍值大于最后一个数的 第一个数
			for(int j=0;j<i;j++){
				if( (2*uglyNums[j]) > uglyNums[i-1]){
					two = uglyNums[j]*2;
					break;
				}	
			}
			//寻找在序列中,比最后一个数小,三倍值大于最后一个数的 第一个数
			for(int j=0;j<=i;j++){
				if((uglyNums[j]*3) > uglyNums[i-1]){
					three = uglyNums[j]*3;
					break;
				}	
			}
			//寻找在序列中,比最后一个数小,五倍值大于最后一个数的 第一个数
			for(int j=0;j<=i;j++){
				if((uglyNums[j]*5) > uglyNums[i-1]){
					five = uglyNums[j]*5;
					break;
				}	
			}
			uglyNums[i]=min(two,three,five);	
		}
		return uglyNums[index-1];
	}

在这种情况下,时间复杂度还是有O(N^2),效率并不是很好,因此考虑以空间换取时间做法的另一种高效做法(C++版可参考《剑指offer》书籍)

<span style="white-space:pre">	</span>private static int min(int a,int b,int c){
	<span style="white-space:pre">	</span>int min =(a<b)? a:b;
		return (min<c)? min:c;
	}
	//寻找第index个丑数
	private static int uglyFound(int index){
		int uglyNums[] = new int[index];
		int two=0,three=0,five=0;
		if (index<=0) return -1;
		uglyNums[0]=1;
		for(int i=1;i<index;i++){
			uglyNums[i]=min(2*uglyNums[two] ,3*uglyNums[three],5*uglyNums[five]);
			if (uglyNums[i]== 2*uglyNums[two] ) two++;
			if (uglyNums[i]== 3*uglyNums[three] ) three++;
			if (uglyNums[i]== 5*uglyNums[five] ) five++;
		}
		return uglyNums[index-1];
	}
这样,只需遍历一遍数组即可。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值