LeetCode 263. Ugly Number

本文介绍了LeetCode中丑数问题的两种解决方案。首先通过提取所有质因数并检查它们是否只包含2、3、5来解决,但此方法在大数情况下效率低下。随后提出了一种更高效的递归方法,只需连续除以2、3、5直至无法整除。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天觉得无聊,就做了几道LeeCode上面的题,碰到了一道关于Ugly Number的题目,其实这道题蛮简单的,但是第一次做的时候,想的比较简单,碰到了钉子,题目的大意如下:

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.

看到的第一眼思路,就想着把所有的素数取出来,然后判断素数是否都是属于2,3,5之间的数。于是乎写下了一下的程序(实在是想的太简单,看到的大神不要见笑):

class Solution {
public:
    bool isUgly(int num) {
        if(num<=0)
            return false;
        else if(num==1)
            return true;
        else
        {
            if(isPrime(num))
            {
                if(num != 2 && num!=3 && num!=5)
                    return false;
                return true;
            }
            vector<int> prime_factors;
            for(int i=2;i<num;i++)
            {
                if(num % i == 0 && isPrime(i))
                {
                    prime_factors.push_back(i);
                }
            }
            
            
            for(int i=0; i<prime_factors.size();i++)
            {
                if(prime_factors[i]!= 2 && prime_factors[i]!= 3 && prime_factors[i]!= 5 )
                    return false;
            }
            return true;
        }
    }
    bool isPrime(int num)
    {
        for(int i=2;i<=num;i++)
        {
            if(num % i == 0)
            {
                return false;
            }
        }
        return true;
    }
};

试了一些例子,结果是正确的,然后就点击了提交,结果当数字很大的时候,就出现了超时的提示,这样的确在算法时间上非常耗时间,不光光要判断一个数是不是质数,还有判断这个数是不是原来数的因子,因此的的确确会非常的耗时间。于是乎采取了一下的思路:

因为判断的因此是2,3,5,因此只需要确定2,3,5是不是其所有的因子即可,即不断的进行判断,不需要取出这个数的所有因子,于是乎一个递归调用的思路形成了:

class Solution {
public:
    bool isUgly(int num) {
    if (num <= 0) {
        return false;
    }
    if (num == 1) {
        return true;
    }

    if (num % 2 == 0) {
        return isUgly(num / 2);
    }

    if (num % 3 == 0) {
        return isUgly(num / 3);
    }

    if (num % 5 == 0) {
        return isUgly(num / 5);
    }

    return false;
}
};
这个应该就比上一个思路快一些了。看书看累了,或者工作做累了,写几道题目,感觉思路开拓了不少。嘻嘻。。。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值