leetcode-236-Ugly Number

问题

题目:[leetcode-236]

思路

素数筛法的思路。但是第一遍TLE。
仔细想了下,这个两边循环的代码时间是没有问题的,因为之前的帖子也学习了。不是完全的 O(N2) 的复杂度。

所以,考虑整数的最大值2147483647。 500002>INTMAX
所以,我猜测可能是辅助空间开大了。因为之前看的和num一样大,那么当num给INT_MAX的时候,时间就上去了。这么分析之后,修改了代码,正确。

所以,改bug是件很重要的事情。根据错误,快速定位,猜测可能出现错误的地方,进行修改就行。原则,只要有一丝希望,就要去尝试。

两个注意点:

  • 辅助空间大小的开辟( n
  • 大素因子的判断(只能有一个大于 n 的因子),对本体来说,只要出现返回false.

代码

class Solution {
public:
    bool isUgly(int num) {
        if(1==num) return true;
        else if(num < 1) return false;
        else{
            const int maxn = 50000;
            vector<int> prime_table;
            vector<bool> marker(maxn+1, 0);
            for(int i = 2; i <=maxn; ++i){
                if(marker[i]) continue;
                else{
                    prime_table.push_back(i);
                    for(int j = i*2; j <= maxn; j += i){
                        marker[j] = true;
                    }
                }
            }
            int prime_cnt = prime_table.size();
            int index = 0;
            while( num != 1 && index < prime_cnt ){
                int& prime = prime_table[index];
                while( num != 1 && num % prime == 0 ){
                    num /= prime;
                    if(prime>5) return false;
                }
                index++;
            }
            if(num != 1) return false;
            else return true;
        }
    }
};

思路1

上面的思路我也是有点迷惑,思路应该很简单,反正就是三个数。判断这三个就好了。

代码1

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

        static int arr[] = {2, 3, 5}; 
        for(int i = 0; i < 3; ++i){
            while( num != 1 && num%arr[i] == 0 )
                num /= arr[i];
            if( 1==num ) return true;
            else continue;
        }
        return false;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值