(ジャワ)leetcode-204カウント素数

【统计质数】
カウント未満の非負数より素数の数、N。

例:

入力:10
出力:4
説明:10未満4つの素数がありますが、彼らは2、3、5、7です。

思考

n個の範囲内のすべての番号をマークするために、最初のブール配列のnotPrimeを確立することは素数である、それが素数ならば、偽としてラベル付けされなければならない、非素数は真としてマークされます。
最初は、すべてのフラグはfalseです。
外側のループ:2からnまで私トラバース、(偽としてマーク)が見つかった場合、素数、数++。
内部ループ:外側のループはtrueにすべてのセットのための私の倍数です。
サイクルの後にすべての数字は、非プロトン真としてマークされています。すべての素数がカウントされます。

コード

public class Solution {
    public int countPrimes(int n) {
        boolean[] notPrime = new boolean[n];//初始为false
        int count = 0;
        for (int i = 2; i < n; i++) {
            if (notPrime[i] == false) {//false表示该数为质数
                count++;
                for (int j = 2; i*j < n; j++) {
                    notPrime[i*j] = true;//将i的所有倍数置为true,也就是非质数
                }
            }
        }
        
        return count;
    }
}

結果を発表

ランタイム:12ミリ秒、カウント素数のためのJavaのオンライン提出の高速化よりも80.90パーセント。
メモリ使用率:33.1メガバイト、カウント素数のためのJavaのオンライン提出未満の100.00パーセント。

改善します

上記のコードは、さらに効率を改善するために修飾することができます。
(2除く)偶数番号のすべてが素数であることができないので、Nの範囲で、必要にのみ、すべての奇数を検出するため。
私たちは、より速く多くのことを実行し、その結果から見ることができます。

コード

public class Solution {
    public int countPrimes(int n) {
    	if (n < 3)
        	return 0;
        
        boolean[] notPrime = new boolean[n];
        int count = 0;
        for (int i = 3; i < n; i += 2) {//遍历所有的奇数
            if (notPrime[i] == false) {
                count++;
                for (int j = 3; i*j < n; j+=2) {//对其倍数(的标记)操作也只是操作所有的奇数
                    notPrime[i*j] = true;
                }
            }
        }
        
        return count+1;//没有把2算进去,所有+1
    }
}

結果を発表

ランタイム:7ミリ、カウント素数のためのJavaのオンライン提出の高速化よりも98.28パーセント。
メモリ使用率:33.1メガバイト、カウント素数のためのJavaのオンライン提出未満の100.00パーセント。

公開された143元の記事 ウォン称賛45 ビュー70000 +

おすすめ

転載: blog.csdn.net/z714405489/article/details/89556707