263. Ugly Number

本文探讨了如何检查一个数是否为丑数(仅包含2、3、5作为质因数)。介绍了两种方法:一种是求所有质因数再判断;另一种是直接去除合法质因数,直至无法去除。后者效率更高,时间复杂度接近常数。
Write a program to check whether a given number is an ugly number.

Ugly numbers are positive numbers whose prime factors only include 2, 3, 5. For example, 6, 8 are ugly while 14 is not ugly since it includes another prime factor 7.

Note that 1 is typically treated as an ugly number.

我的思路是 求的 n 所有的指数 然后 在判断所有的质数中是否全是 1 2 3 5。 代码如下:

static boolean isUgly(int n)
    {
        if(n==1)
            return true;
        if(n <  0)
            return false;

        List<Integer> lst = new ArrayList<Integer>();
        while( n > 1)
        {
        for(int i = 2 ; i <= n ; i++)
        {
            if(n%i ==0 )
            {
                lst.add(i);
                n = n /i;
                break;
            }
        }
        }

        for(int i : lst)
        {
            if(i!=2 && i!=3 && i!=5)
                return false;
        }

        return true;

    }

时间复杂度 0(n^2).而且提交的时候 没通过,没明白。

后来看了 discuss中的讨论
用了以下代码实现:

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

我的思路是求因子,而这个做法是根据合法的因子在去判断。
很明显第二种做法利用了题目的已知的条件。
并且时间复杂度 0(1).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值