1. 程式人生 > >leetcode Count Primes 統計 素數 個數 超時 解決方案

leetcode Count Primes 統計 素數 個數 超時 解決方案

Count Primes
Description:

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

方法1

public class CountPrimes {

    public static void main(String[] args) {
        System.out.println(countPrimes(1500000));
    }

    public static int countPrimes(int n) {
        if (n == 0 || n == 1 || n == 2
) return 0; int result = 0; for (int i = 3; i < n; i += 2) { boolean flag = true; int sqrtNum = (int) Math.sqrt(i); for (int j = 3; j <= sqrtNum; j++) { if (i % j == 0) { flag = false; break
; } } if (flag) { ++result; } } return result + 1; } }

超時了

需要一個標誌位, 比如6, 是2的倍數, 可以剔除; 就沒必要再根據是3的倍數進行剔除

方法2

試了一下這個方法, 用了容器, 還是超時了

public static int countPrimes(int n) {
        if (n == 0 || n == 1 || n == 2
) return 0; List<Integer> origin = new ArrayList<Integer>(n); for (int i = 0; i < n; i++) origin.add(i); for (int i = 3; i < n; i ++) { if (i > origin.size() - 1) break; int num = origin.get(i); int sqrtNum = (int) Math.sqrt(num); for (int j = 2; j <= sqrtNum; j++) { if (num % j == 0) { origin.remove(i); i--; break; } } } return origin.size() -2; }

方法3

import java.util.ArrayList;
import java.util.List;

public class CountPrimes {

    public static void main(String[] args) {
        System.out.println(countPrimes(1));
        System.out.println(countPrimes(100));
        System.out.println(countPrimes(1500000));
    }

    public static int countPrimes(int n) {
        if (n == 0 || n == 1 || n == 2)
            return 0;
        boolean[] origin = new boolean[n];
        for (int i = 0; i < n; i++)
            origin[i] = true;

        for (int i = 2; i < n; i++) {
            if (origin[i]) {
                int temp = i + i;
                while (temp < n) {
                    origin[temp] = false;
                    temp = temp + i;
                }
            }
        }
        int result = 0;
        for (int i = 2; i < n; i++) {
            if (origin[i]) {
                result++;
            }
        }
        return result;
    }

}

Note:

先設定一個長度為n, 值都為true的陣列

從中依次剔除2, 3, 5, 7, 11的倍數

從每個數的 >=2 的倍數開始剔除, 不剔除它本身

比如 2 就不需要剔除, 3 也不需要剔除

那4不剔除, 不是錯了嗎? 4 是 2 的倍數, 早被剔除了, 同理, 6, 8 等等也是