问题
思路
素数筛法的思路。但是第一遍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;
}
};