LeetCode 204. Count Primes

来源:互联网 发布:js new一个对象 代码 编辑:程序博客网 时间:2024/04/29 14:48

LeetCode原题和维基百科都有解释用到的Sieve of Eratosthenes算法。
该算法可在O(nloglogn)时间内,求出小于n的所有质数;空间复杂度为O(n).
随着n的增大,当空间有限时,维基百科还提出了一种分段筛选(segmented sieve)方法,在时间复杂度不变的情况下,将空间复杂度降为O(n^0.5).

下面代码实现了常规筛选(regular sieve)方法:

class Solution {public:    int countPrimes(int n)     {        if (n <= 1)        {            return 0;        }        bool prime[n];        memset(prime, true, sizeof(prime));        for (int i = 2; i * i < n; ++ i)        {            if (prime[i] == false)            {                continue;            }            for (int j = i * i; j < n; j += i)            {                prime[j] = false;            }        }        return count_if(prime+2, prime+n, [](bool prime) -> bool { return prime;});    }};
0 0