LeetCode 263. Ugly Number && 264. Ugly Number II用java实现丑数的判定与查找

原题链接:
https://leetcode.com/problems/ugly-number/
https://leetcode.com/problems/ugly-number-ii/

Ugly numbers are positive numbers whose prime factors only include 2, 3, 5.

丑数的定义:一个数字只有2,3,5三个质因子。1也是丑数。
丑数一定是可以被2,3,或者5一直除尽的。譬如,2x2x2x2x2x3x3x3这个数字,就是丑数。而2x2x2x3x7就不是。

public boolean isUgly(int n){
	if (n == 0) return false;
	if(n == 1) return true;
	while(n % 2 == 0){n = n / 2; }
	while(n % 3 == 0){n = n / 3; }
	while(n % 5 == 0){n = n / 5; }
	return n==1; 
}

寻找第n个丑数:
第一种方法(Time Limit Exceeded):
暴力法,一个个地判断某数是否为丑数。
在这里插入图片描述
第二种方法:
创建一个长度为input的n的数组,把数组第一项初始化为1。
核心:如果数字n是ugly number,那么数字n2, n3, n*5也是ugly number。
此数组用于记录第n个丑数字。最后返回数组[n-1]的值即可。

public int nthUglyNumber(int n) {
		int nums [] = new int [n];
		nums[0] = 1;
		int index2 = 0, index3 = 0, index5 = 0;
		int factor2 = 2, factor3 = 3, factor5 = 5;
		for(int i =1; i < n; i++){
		
		int temp = Math.min(Math.min(factor2, factor3), factor5); 
		//在2、3、5的倍数之间选最小值
		
		nums[i] = temp; //populate the min value to nums
		
		if(temp == factor2){
		//如果我们刚刚写入的temp是2的倍数,我们应该更新这个2的倍数
		factor2 = 2 * nums[++index2]; 
		}
		
		if(temp == factor3){
		//如果我们刚刚写入的temp是3的倍数,我们应该更新这个3的倍数
		factor3 = 3 * nums[++index3]; 
		}
		
		if(temp == factor5){
		//如果我们刚刚写入的temp是5的倍数,我们应该更新这个5的倍数
		factor5 = 5 * nums[++index5]; 
		}
		
		//注意:有时候在取min的时候会有数字重合的现象,那个时候就是每个数字都要更新倍数
	}
	return nums[n-1];
}

Clarifications on index2, index3, index5:
这三个变量用于记录倍数们在nums中的位置。其实这个method就是一个不断取最小的2、3、5倍数的过程。取到一个最小值就放进去一个,一直比较,直到nums满为止。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值