把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。

来源:互联网 发布:mac给手机充电不停闪 编辑:程序博客网 时间:2024/05/16 08:12

分析:在丑数数列中,每一个丑数只包含2,3,5因子,也就是说每一个丑数的最小因子只包含2,3,5序列,1默认是丑数,这样。我们从1开始,进行每一次乘以2,乘以3,乘以5运算,选取其中最小的数字添加到丑数序列(因为要求丑数序列有序,从小到大)。

public class Solution {
    public int GetUglyNumber_Solution(int index) {
        if(index <=0){
            //负数
            return 0;
        }
        //存放丑数序列
        int[] c=new int[index];
        c[0]=1;//默认第一个数字1是丑数
        int position_2=0;//丑数中该位置是否已经乘2并且放入丑数数组中
        int position_3=0;//丑数中该位置是否已经乘3并且放入丑数数组中
        int position_5=0;//丑数中该位置是否已经乘5并且放入丑数数组中
        for(int i=1;i<index;i++){
            //每一个丑数是前一个丑数的2,3,5倍
            //获取所有可能的丑数序列中最小的放入数组
           int min_c=min(c[position_2]*2,c[position_3]*3,c[position_5]*5);
           //存放返回的最小丑数
           c[i]=min_c;
            if (c[position_2] * 2 <= min_c) 
                //丑数中该位置已经乘2,挪动到新位置
                position_2++;  
            if (c[position_3] * 3 <= min_c)
                 //丑数中该位置已经乘3,挪动到新位置
                position_3++;  
            if (c[position_5] * 5 <= min_c) 
                 //丑数中该位置已经乘5,挪动到新位置
                position_5++;  
        }
        return c[index-1];
}
    //获取最小的丑数
    public int min(int a,int b,int c){
        return  a>b? (b>c?c:b): (a>c?c:a);
    }
}

阅读全文
0 0