博文中会简要介绍Leetcode P0204题目分析及解题思路。
“Count Primes”是一道比较有意思的题目。题目要求我们找出所有小于n
的素数,如果我们遍历n
个数并且对每个数都判断其是否是素数(也就是寻找其因数),那显然这个时间复杂度是O(n^2)的,可以预料的是这个朴素解法会出现超时的可能。
所以对于这道题我们要变换思路,题目要求我们寻找素数,我们可以通过排除或者说移除所有非素数(合数)来保留所有素数,这样一来思路就变成移除所有合数。
Count the number of prime numbers less than a non-negative number, n.
具体思路其实也十分直接明了。既然我们需要移除所有合数,那么我们选择任意一个数,如果它没有被移除,显然它是素数,然后我们用一个系数coef
去乘上它得到所有具有这个质因数的合数(coef
大于等于2),这样一来我们就可以得到和它相关的所有合数并且移除这些合数。我们只需要重复上述操作即可。
以下是Java的题解代码实现。
class Solution {
public int countPrimes(int n) {
if (n <= 1)
return 0;
boolean[] nonPrimes = new boolean[n];
int count = 0;
for (int num=2; num<n; ++num) {
if (nonPrimes[num])
continue;
for (int coef=2; num*coef<n; ++coef) {
nonPrimes[num*coef] = true;
}
++count;
}
return count;
}
}
以下是C++的题解代码实现。
class Solution {
public:
int countPrimes(int n) {
if (n <= 1)
return 0;
vector<bool> primes(n, true);
int count = 0;
for (int num=2; num<n; ++num) {
if (!primes[num])
continue;
for (int coef=2; coef*num<n; ++coef) {
primes[num*coef] = false;
}
++count;
}
return count;
}
};