题目:204. 计数质数
统计所有小于非负整数 n
的质数的数量。
难度:简单
示例 1:
输入:n = 10
输出:4
解释:小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。
示例 2:
输入:n = 0
输出:0
示例 3:
输入:n = 1
输出:0
提示:
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/count-primes
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
- 厄拉多塞筛法(埃氏筛)
- 线性筛
官方解题代码
厄拉多塞筛法(埃氏筛)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| class Solution { public int countPrimes(int n) { int[] isPrime = new int[n]; Arrays.fill(isPrime, 1); int ans = 0; for (int i = 2; i < n; ++i) { if (isPrime[i] == 1) { ans += 1; if ((long) i * i < n) { for (int j = i * i; j < n; j += i) { isPrime[j] = 0; } } } } return ans; } }
|
线性筛
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| class Solution { public int countPrimes(int n) { List<Integer> primes = new ArrayList<Integer>(); int[] isPrime = new int[n]; Arrays.fill(isPrime, 1); for (int i = 2; i < n; ++i) { if (isPrime[i] == 1) { primes.add(i); } for (int j = 0; j < primes.size() && i * primes.get(j) < n; ++j) { isPrime[i * primes.get(j)] = 0; if (i % primes.get(j) == 0) { break; } } } return primes.size(); } }
|