Problem: 204. 计数质数
文章目录
- 思路
- 解题方法
- 复杂度
- Code
思路
这个问题的关键是找出小于n的所有质数。质数是只有两个正因数(1和它自身)的自然数,且必须大于1。
解题方法
我们可以使用埃拉托斯特尼筛法(Sieve of Eratosthenes)来解决这个问题。这个算法的基本思想是从2开始,将每个质数的各个倍数,标记为合数。一个合数总是可以表示为质数的倍数,所以,如果我们在发现一个新的质数时,将其未来可能的倍数都标记为合数,那么到最后剩下的就是质数。
复杂度
时间复杂度:
O ( n log log n ) O(n\log\log n) O(nloglogn),这是因为我们需要对每个数进行筛选,筛选的过程中,每个数会被其所有的质数因子筛选到。
空间复杂度:
O ( n ) O(n) O(n),我们需要一个长度为n的布尔数组来记录每个数是否被筛选过。
Code
class Solution {public static int countPrimes(int n) {return ehrlich2(n - 1);}public static int ehrlich2(int n) {if(n <= 1) {return 0;}boolean[] vis = new boolean[n + 1];int cnt = (n + 1) / 2;for(int i = 3; i * i <= n; i += 2) {if(!vis[i]) {for(int j = i * i; j <= n; j += 2 * i) {if(!vis[j]) {vis[j] = true;cnt--;}}}}return cnt;}
}