计数质数

第一种,自然而然的想法:

class Solution {
    public int countPrimes(int n) {
        int i=2,j=2,count=0;
        int flag=1;
        for(;i<n;i++){
            while(j<=Math.sqrt(i)){
                if(i%j==0) {
                    flag=0;
                    break;
                }
                else j++;
            }
            if(flag==1) {
                count++; 
            }
            flag=1;
            j=2;
        }
        return count;
    }
}

可以估计时间复杂度为logn*n,这种解法会超出时间限制。

第二种:素数筛选法,抄的~~~

class Solution {

    public int countPrimes(int n) {
        boolean isPrime[]=new boolean[n];
        for(int i=0;i<n;i++){
            isPrime[i]=true;
        }

        for(int i=2;i*i<=n;i++){
            if(isPrime[i]==false)continue;
            for(int j=2;j*i<n;j++){
                isPrime[i*j]=false;
            }
        }

        int ans=0;
        for(int i=2;i<n;i++){
            if(isPrime[i]==true)ans++;
        }
        return ans;
    }


}

时间复杂度O(n)

综合对比二者,对于150000这样的数时,第一种解法520ms左右,第二种解法20ms不到。

猜你喜欢

转载自blog.csdn.net/tengfeipu/article/details/81238554