204. Count Primes

题目分析

题目链接,登录 LeetCode 后可用
这道题让我们统计所有小于正整数 n 的非负整数中素数(质数)的个数。首先明确一下素数的定义,大于 1,除了 1 和自身以外没有别的因子的正整数。下面给出的两个解法,第一个解法超时了,但是是一个比较正常的思路,第二个解法是网上查到的一个解法,被称为埃拉托斯特尼筛法

代码

解法一(超时)

该解法就是依次判断每个数是不是质数,提交后,提示超时

class Solution {
    public int countPrimes(int n) {
        if(n == 0 || n == 1) {
            return 0;
        }
        int count = 0;
        // 题目要求小于 n
        for(int i = 2; i < n ; i++) {
            if(check(i)) {
                count ++;
            }
        }
        return count;
    }
    
    private boolean check(int n) {
        for(int j = 2; j <= Math.sqrt(n); j++) {
            // 如果能整除,则不是质数(素数)
            if(n % j == 0) {
                return false;    
            }
        }
        return true;
    }
}

解法二

class Solution {
    public int countPrimes(int n) {
        
        if(n == 0 || n == 1) {
            return 0;
        }
        
        // 定义数组并初始化
        boolean[] prime = new boolean[n + 1];
        for(int i = 0; i < n; i++) {
            prime[i] = true;
        }
        
        // 0 和 1 不是素数
        prime[0] = false;
        prime[1] = false;
        // 记录素数的个数
        int count = 0;
        
        for(int i = 0; i <= Math.sqrt(n); i++) {
            if(prime[i]) {
                for(int j = i * i; j < n; j += i) {
                    prime[j] = false;
                }
            }
        }
        
        for(int i = 0; i < n; i++) {
            if(prime[i]) {
                count ++;
            }
        }
        return count;
    }
}

你可能感兴趣的:(204. Count Primes)