LeetCode---UglyNumberII解题分析

31 篇文章 0 订阅
23 篇文章 0 订阅

题意描述:UglyNumber的定义为一个数分解后只包含2、3、5因子,比如6、8是UglyNumber而14不为UglyNumber,1是典型的UglyNumber。求第N个UglyNumber

解题思路一:逐个判断每个数字是否为UglyNumber至第N个UglyNumber为止,而判断每个数字是否为UglyNumber就是根据定义依次除去因子5、3、2,当不能再被5、3、2整除时是1就是UglyNumber,否则不为UglyNumber

boolean isUgly(int num){
	if(num == 1) return true;		
	while((num >= 5) && (num%5 == 0)) num /= 5;
	while((num >= 3) && (num%3 == 0)) num /= 3;
	while((num >= 2) && (num%2 == 0)) num /= 2;			
	return num == 1;
}
int nthUglyNumber1(int n){
	int count = 0;//计数第i个UglyNumber
	int num = 1;//从1开始判断是否为UglyNumber
	for(; count != n; num++){
		if(isUgly(num)) count++;
	}
	return num-1;
}
解题思路二:由于思路一的方法相当于是暴力破解,当所求N比较大时所需要的时间就较多,那么可以改一个思路想一下,由于UglyNumber的定义就是1以及因子为2、3、5的数字,所以每个UglyNumber可以从上一个UglyNumber推出,借助该思路找到第N个UglyNumber

int nthUglyNumber(int n){
	LinkedList<Integer> l1 = new LinkedList<Integer>(); 
	LinkedList<Integer> l2 = new LinkedList<Integer>();
	LinkedList<Integer> l3 = new LinkedList<Integer>();
	l1.add(1);
	l2.add(1);
	l3.add(1);

	int theNumber = 0;

	for(int i=0; i<n; i++){
		theNumber = Math.min(Math.min(l1.get(0), l2.get(0)), l3.get(0));
		
		if(l1.get(0) == theNumber) l1.remove(0);
		if(l2.get(0) == theNumber) l2.remove(0);
		if(l3.get(0) == theNumber) l3.remove(0);
		
		l1.add(theNumber*2);
		l2.add(theNumber*3);
		l3.add(theNumber*5);
	}

	return theNumber;
}















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值