丑数,质因子(能够分解成2^x3^y5^z)

题目要求找到第N个只包含质因子2、3和5的丑数。解题思路是通过不断乘以2、3、5并将结果插入正确位置来生成丑数序列。
摘要由CSDN通过智能技术生成
题目

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

思路

这道题目自己是有思路的,丑数能够分解成2x3y5^z,
所以只需要把得到的丑数不断地乘以2、3、5之后并放入他们应该放置的位置即可,
而此题的难点就在于如何有序的放在合适的位置。
解题连接

//创建一个数组来存储第i个丑数,
//将丑数乘以2,3,5;取出最小的那个是下一个丑数,
//判断是通过乘2,3,5中那个一数得到的丑数,那么这个指针可以指向下一个,进入下一次判断
//注意:三个指针分别代表的是需要本轮被用来比较的丑数的下标值
public class Solution{
    public int GetUglyNumber_Solution(int index) {
        if(index<=0) return 0;
        int[] arr =new int[index];
        int p2=0,p3=0,p5=0;
        arr[0]=1;
        //思路:
        for(int i=1;i<index;i++){
            arr[i]=Math.min(arr[p2]*2,Math.min(arr[p3]*3,arr[p5]*5));
            if(arr[i]==arr[p2]*2) p2++;
            if(arr[i]==arr[p3]*3) p3++;
            if(arr[i]==arr[p5]*5) p5++;
        }
        return arr[index-1];
    }
}

复杂度过高

public class Solution {
    public int GetUglyNumber_Solution(int index) {
        int count=1;
        int x=2;
        while(count<index){
            if(isUglyNumber(x)){
                count++;
            }x++;
        }
        return x;
    }
    public boolean isUglyNumber(int n){
       while(n!=1){
           if(n%5==0) n/=5;
           else if(n%3==0) n/=3;
           else if(n%2==0) n/=2;
           else break;
       }
        return n==1;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值