LeetCode Top Interview Questions 204. Count Primes (Java版; Easy)

welcome to my blog

LeetCode Top Interview Questions 204. Count Primes (Java版; Easy)

题目描述

Count the number of prime numbers less than a non-negative number, n.

Example:

Input: 10
Output: 4
Explanation: There are 4 prime numbers less than 10, they are 2, 3, 5, 7.

第一次做; 这个计算[2,n)上素数的个数的算法叫作埃拉托色尼筛选法(Sieve of Eratosthenes); 算法思想如图

埃拉托色尼筛选法(the Sieve of Eratosthenes)简称埃氏筛法,是古希腊数学家埃拉托色尼(Eratosthenes 274B.C.~194B.C.)提出的一种筛选法。 是针对自然数列中的自然数而实施的,用于求一定范围内的质数

class Solution {
    public int countPrimes(int n) {
        if(n<2)
            return 0;
        boolean[] isPrime = new boolean[n];
        Arrays.fill(isPrime, true);
        int count = 0;
        for(int i=2; i<n; i++){
            if(isPrime[i]==true){
                count++;
                //i的倍数就不是素数了
                for(int j=2; j*i<n; j++){
                    isPrime[j*i] = false;
                }
                /*
                内层循环也可以这么写, 快1ms
                for(int j=2*i; j
            }
        }
        return count;
    }
}

LeetCode题解, 大循环执行sqrt(n)次, 就能将notPrime填写完整! 不过这样就不能在大循环中计数了, 需要单独写个循环遍历notPrime用来统计质数的个数

public int countPrimes(int n) {
    if(n <=1 ) return 0;
    
    boolean[] notPrime = new boolean[n];        
    notPrime[0] = true; 
    notPrime[1] = true; 

    for(int i = 2; i < Math.sqrt(n); i++){
        if(!notPrime[i]){
            for(int j = 2; j*i < n; j++){
                notPrime[i*j] = true; 
            }
        }
    }
    
    int count = 0; 
    for(int i = 2; i< notPrime.length; i++){
        if(!notPrime[i]) count++;
    }
    return count; 
}

你可能感兴趣的:(LeetCode,Top,Interview,Questions,LeetCode)