LeetCode204-Count Primes

分析

这个题相当于求小于n的所有质数,曾在编程之美中看到过一个求一组质数的算法,叫厄拉多塞筛法,时间复杂度仅有O(nloglogn),这是一个相当好的算法(如果从1到n-1分别判断质数,时间复杂度为O(nsqrt(n)))。
厄拉多塞筛法的步骤:建立从2到n的集合G={2, 3, 4, ..., n},每次从集合中取出最小的数A,这个数就是质数;然后将数A * times从集合中删除,其中1<=times<=n/A。得到一个新的集合G',重复上述步骤直到集合为空,就取出了所有质数。
举例一个集合{2, 3, 4, ..., 12}:
stp1:最小值为2,取出2并删除2,4,6,8,10,12,集合变为{3, 5, 7, 9, 11};
stp2:最小值为3,取出3并删除3,6,9,集合变为{5, 7, 11}
...
最后得到质数为2,3,5,7,11。

注意

  1. 一开始我用unordered_set来标记一个数是否被删除,后来内存使用超出要求。后来改用bool数组来记录就AC了。
  2. 注意是小于n,而非小于等于n。
class Solution {
public:
    int countPrimes(int n) {
        bool isDeleted[n];
        for (unsigned i = 0; i < n; ++i)
            isDeleted[i] = false;

        int count = 0;
        for (unsigned i = 2; i < n; ++i) {
            if (!isDeleted[i]) {
                ++count;
                for (unsigned times = 1; i * times <= n; ++times) {
                    isDeleted[i*times] = true;
                }
            }
        }
        return count;
    }
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 因为之前就复习完数据结构了,所以为了保持记忆,整理了一份复习纲要,复习的时候可以看着纲要想具体内容。 树 树的基本...
    牛富贵儿阅读 7,012评论 3 10
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,779评论 18 399
  • “妈妈,妈妈,快出来!今晚的月亮好美呀。” 女儿娇美的叫声从院子里传来,一声声催我去看月亮。举头望去,真是一轮明月...
    欢呼收割一阅读 516评论 13 16
  • 即使是在人潮中,我第一眼看到的依然是你。即使是擦肩而过,你依然把我当做空气
    千寻千与阅读 170评论 0 1
  • 文/張春勇 四月的北方,冬天还没有过去 一株寒梅伸展枝干 从院子的北墙角挤出微笑 阳光戏闹它的妩媚 虬枝粘雪,走过...
    Z无尾鱼阅读 133评论 0 0