【LeetCode刷题笔记-25 204:计数质数】

题目:
【LeetCode刷题笔记-25 204:计数质数】_第1张图片
今天这题很简单啊,找质数嘛,谁不会呀

上来就是一个暴力算法,哦吼,超时了。

于是改进了一下,只遍历到sqrt(n),勉强能过

class Solution {
public:
    bool isPrime(int x) {
        for (int i = 2; i * i <= x; ++i) {
            if (x % i == 0) {
                return false;
            }
        }
        return true;
    }

    int countPrimes(int n) {
        int ans = 0;
        for (int i = 2; i < n; ++i) {
            ans += isPrime(i);
        }
        return ans;
    }
};

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/count-primes/solution/ji-shu-zhi-shu-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

这里重点讲一下另一个方法

埃氏筛

思路是这样的:

1.我们去寻找一个质数,那么这个质数的所有倍数一定是合数。那么我们将这些合数直接置0,防止后面会遍历到。

2.那么我们从2X开始标记其实也是多余的,因为2X的数字早就被标记过了。比如6,就被2标记过,不需要3再去标记。所以直接从X*X开始标记可以进一步提升算法的效率。

C++代码:

class Solution {
public:
    int countPrimes(int n) {
        vector<int> isPrime(n, 1);
        int ans = 0;
        for (int i = 2; i < n; ++i) {
            if (isPrime[i]) {//有没有被标记过 
                ans += 1;
                if ((long long)i * i < n) {//从X*X开始标记 
                    for (int j = i * i; j < n; j += i) {
                        isPrime[j] = 0;
                    }
                }
            }
        }
        return ans;
    }
};

这次的题很简单,就不设计测试用例了。

你可能感兴趣的:(算法,算法,leetcode,c++)