算法记录
LeetCode 题目:
给定整数 n
,返回所有小于非负整数 n
的质数的数量。
说明
一、题目
输入: n = 10
输出: 4
解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。
二、分析
- 题目我感觉是有点儿问题的,他应该想表达的意思是求取小于给定数的所有质数的数量,并且是正整数。
- 我们很容易就能想到使用遍历枚举的方式进行输出,但是这样的时间复杂度过高,不太可取。
- 因此我们换一个思维来看题,如果我们现在拿到了一个质数,那么所有大于当前质数且存在倍数关系的数据都不是质数,下次计算到的时候就不用再判断了。
- 利用这样的思想就可以使用一个数组来进行标记,只要当前的标志为空,那么就是一个质数,并且要将所有的当前数的倍数给进行标记。
- 中间为了避免重复计算,只要一个数是已有质数的一个倍数就可以不用往后标记了,因为同一个数可能与多个质数保持倍数关系。
- 这种方法也有一个学名,叫做线性筛。
class Solution {
public int countPrimes(int n) {
List<Integer> ret = new ArrayList();
int[] flag = new int[n];
for(int i = 2; i < n; i++) {
if(flag[i] == 0) {
ret.add(i);
}
for(int j = 0; j < ret.size() && i * ret.get(j) < n; j++) {
flag[i * ret.get(j)] = 1;
if(i % ret.get(j) == 0) break;
}
}
return ret.size();
}
}
总结
大量数据计算下的剪枝操作。