丑数(两种方法)

方法一:

最初写的时候只想到了这一种,最多的优化也就是 i*2,后来想想还是练的少,没有思路。先把测试程序贴出来

public class Solution {
	public static void main(String[] args) {
		//Scanner sc = new Scanner(System.in);
		for(int i=1;i<1010;i++) {
			System.out.println(i+":"+GetUglyNumber_Solution(i));;
		}
	}
	public static int GetUglyNumber_Solution(int index) {
        if(index==0)
            return 0;
        int count=1;
        int N=-1;
        if(index==1)
            return 1;
        for(int i=2;count<index;i++){
            if(isUglyNnumber(i)){
                count++;
                N=i;
            }
        }
        return N;
        
    }
	public static boolean isUglyNnumber(int n){
        while(n!=1){
            if(n%2==0)
                n=n/2;
            if(n%3==0)
                n=n/3;
            if(n%5==0)
                n=n/5;
            if(n%2!=0&&n%3!=0&&n%5!=0&&n!=1)
                return false;
        }
        return true;
        
    }
		
	
}

后来我在实际测试的时候发现,当N=1000左右时,数字运算量会变得很大,于是乎,向大佬们的程序思路取取经,

有了方法二。

方法二:

核心思想就是每一个丑数*2||*3||*5后找出最小的就可以生成下一个丑数,用这种思路,一个数组保存最小的丑数(从小到大),

然后保存index2 index3 index5 的不同迭代值,每次从他们array[index2]*2 array[index3]*3 array[index5]*5中取出最小的,然后

被用到的index值加一。

三个下标就是在维护三个数组,每个数组从1到N

比如:

按列竖着看

index2   index3    index5

1*2          1*3       1*5

2*2          2*3        2*5

....           .......       .......

n*2           n*3         n*5

每一次从三个列中取出最小的一个,然后此列下标+1。

代码如下:

public class Solution {
    public int GetUglyNumber_Solution(int index) {
        if(index==0)
            return 0;
        int[] array=new int[index];
        int count=1;
        array[0]=1;
        int min,index2=0,index3=0,index5=0;
        while(count<index){
            min=Math.min(array[index2]*2, array[index3]*3);
            min=Math.min(min, array[index5]*5);
            array[count]=min;
            if(array[index2]*2<=min)
                index2++;
            if(array[index3]*3<=min)
                index3++;
            if(array[index5]*5<=min)
                index5++;
            count++;
        }
        return array[index-1];
    }
    
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值