今天觉得无聊,就做了几道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;
}
};
这个应该就比上一个思路快一些了。看书看累了,或者工作做累了,写几道题目,感觉思路开拓了不少。嘻嘻。。。