• Leetcode(204) Count Primes


    题目

    Description:

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

    Credits:
    Special thanks to @mithmatt for adding this problem and creating all test cases.

    Hint:

    Let’s start with a isPrime function. To determine if a number is prime, we need to check if it is not divisible by any number less than n. The runtime complexity of isPrime function would be O(n) and hence counting the total prime numbers up to n would be O(n2). Could we do better?

    分析

    计算小于n的非负整数中素数的个数。

    这本是一个简单的题目,直观的反应,就是逐个判断并累计数目,但是直接这样提交的话得到的肯定是TLE的。因为本题的核心便是考察的性能问题。

    素数的动态演示,此处给出了素数累计的另一种思路,我们知道任何一个素数的倍数都是合数,从此出发,先初始化一个n个单元的标志数组,将每个元素标记为素数,然后将素数的倍数标志改为false。最后遍历标志数组,得到素数的个数。

    下面给出三种实现,方法一是TLE的算法,方法二和方法三核心思想一样,只不过是采用了不同的累计方式,是AC的。

    AC代码

    class Solution {
    public:
        //方法一:逐个判断O(n^(3/2))算法,TLE
        int countPrimes1(int n) {
            int count = 0;
            for (int i = 2; i < n; ++i)
            {
                if (isPrime(i))
                    ++count;
            }
            return count;
        }
    
        bool isPrime(int n)
        {
            for (int i = 2; i <= sqrt(n); ++i)
                if (n % i == 0)
                    return false;
            return true;
        }
    
        //方法二:素数不能被比它小的整数整除,建一个标志数组,从2开始,把其倍数小于N的都删掉
        int countPrimes2(int n)
        {
            vector<int> flags(n + 1, 1);
            for (int i = 2; i*i <= n; ++i)
            {
                //把素数的倍数全部设置为非素数标志
                if (flags[i])
                {
                    //内层循环从i开始, 比i小的会在以前就被check过
                    for (int j = i; i*j < n; ++j)
                    {
                        flags[i*j] = 0;
                    }//for
                }//for
            }//for
    
            int count = 0;
            for (int i = 2; i < n; ++i)
            {
                if (flags[i])
                    ++count;
            }
            return count;
        }
    
        //方法三,与二思路相同,另一种实现方式
        int countPrimes(int n)
        {
            if (n <= 2)
                return 0;
    
            vector<int> flags(n, 1);
            //记录素数的个数
            int count = n - 2;
            for (int i = 2; i*i <= n; ++i)
            {
                if (flags[i])
                {
                    //内层循环从i开始, 比i小的会在以前就被check过
                    for (int j = i; i*j < n; ++j)
                    {
                        //如果原来标记的为素数,现在改为非素数,同时更新素数个数
                        if (flags[i*j])
                        {
                            flags[i*j] = 0;
                            --count;
                        }//if
                    }//for
                }//if
            }//for
            return count;
        }
    };

    GitHub测试程序源码

  • 相关阅读:
    Pyhton入门 笔记 第四天 Python的高级语法与用法
    Pyhton入门 笔记 第四天 正则表达式与JSON
    Pyhton入门 笔记 第三天 正则表达式与JSON
    Pyhton入门 笔记 第三天 面向对象 类
    Pyhton入门 练习 第三天 用循环输出小数点到某位
    Pyhton入门 笔记 第三天 函数
    Pyhton入门 笔记 第三天 包 模块 函数与变量作用域
    Pyhton入门 笔记 第二天 分支 循环 条件与枚举
    JS 获取地址栏参数
    文件的读取和写入
  • 原文地址:https://www.cnblogs.com/shine-yr/p/5214772.html
Copyright © 2020-2023  润新知