这是一道标为Easy的新题,尽管题目中给了两个链接,但是这两个链接都是关于数学方面的论证。其基本思想是Sieve of Eratosthenes,咋一看特别唬人,仔细想想还是很直观的。
题目如下:
给出数字N,找出比N小的所有素数(or质数whatever)的总个数。
Solution Code(C++)
class Solution {
public:
int countPrimes(int n) {
if(n <= 2) { //Base case;
return 0;
}
bool checkPrime[n];
for(int i = 0; i < n; i++) {
checkPrime[i]=true;
}
int prime = 2;
while(prime <= sqrt(n)){ //If a number is not a prime, it at most has a unit factor <= sqrt(n)
for(int x = 2; prime*x < n; x++){
checkPrime[x*prime] = false;
}
prime++; //move to the next number
while(prime <= n/2 && checkPrime[prime] == false) { //if the number has been marked as not a prime, jump over it.
prime++;
}
}
int count = 0;
for(int i = 2; i < n; i++){ //Trap: remember start from 2.
if(checkPrime[i]) count++;
}
return count;
}
};
时间复杂度:O(n)
空间复杂度:O(n)
总体来说还是一道Entry-Level的好题。
PS:过段时间会给出Java & Ruby版本解法。
本文介绍了一个简单的算法——Sieve of Eratosthenes,用于找出小于给定数字N的所有素数。通过实现C++代码,解释了算法的时间和空间复杂度,并提供了Java和Ruby版本的解决方案。
715

被折叠的 条评论
为什么被折叠?



