LeetCode-计数质数

915 阅读1分钟

算法记录

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();
    }
}

总结

大量数据计算下的剪枝操作。