LeetCode 204——計數質數
阿新 • • 發佈:2021-01-18
統計所有小於非負整數n的質數的數量
1、暴力解法一
class Solution {
public int countPrimes(int n) {
int count = 0;
if(n==0) return 0;
for(int i=2; i<n; i++) {
int j = 0;
for(j=2;j<i;j++) {
if(i%j==0) break;
}
if(j==i) count++;
}
return count;
}
}
2、暴力解法二
class Solution {
public int countPrimes(int n) {
int count = 0;
if(n==0) return 0;
for(int i=2; i<n; i++) {
int j = 2;
for(;j*j<=i;j++) {
if(i%j==0) break;
}
if(j*j>i) {
//System.out.println("the count is:::" + count+ ":::i::" + i);
count++;
}
}
return count;
}
}
上述兩個解法類似,只不過解法二的時間複雜度要低一些,但是兩個都超出時間限制。
3、埃氏篩
動圖
3.1
public static int countPrimes(int n) {
if(n==0 || n==1) return 0;
boolean[] isPrime = new boolean[n];
Arrays.fill(isPrime, true);
int ans = 0;
isPrime[0] = false ;
isPrime[1] = false;
for (int i = 2; i*i<n; ++i) {
if (isPrime[i]) {
for(int j=i+i;j<n;j+=i) {
isPrime[j] = false;
}
}
}
for(int i=0;i<n;i++) {
if(isPrime[i]) {
System.out.println("the i is:::" + i);
ans+=1;
}
}
return ans;
}
3.2 提升3.1的時間複雜度
public static int countPrimes(int n) {
if (n == 0 || n == 1)
return 0;
boolean[] isPrime = new boolean[n];
Arrays.fill(isPrime, true);
int ans = 0;
isPrime[0] = false;
isPrime[1] = false;
for (int i = 2; i < n; ++i) {
if (isPrime[i]) {
ans+=1;
if (i * i < n) {
for (int j = i + i; j < n; j += i) {
isPrime[j] = false;
}
}
}
}
return ans;
}