Leetcode P0204"Count Primes" 题解

2020/10/13 Leetcode

博文中会简要介绍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;
    }
};

Search

    Table of Contents