[LeetCode 204] Count Primes(Python)

来源:互联网 发布:淘宝修改密码在哪里 编辑:程序博客网 时间:2024/06/01 08:07

题目描述

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

思路

开辟一个辅助数组,依次标记2n的所有倍数。最后遍历该数组,计数素数。

代码

class Solution(object):    def countPrimes(self, n):        """        :type n: int        :rtype: int        """        if n is None or n <= 1:            return 0        tmp = [True] * n        tmp[0] = False        tmp[1] = False        i = 2        while i * i < n:            if tmp[i]:                j = i                while j * i < n:                    tmp[i * j] = False                    j += 1            i += 1        res = 0        for k in tmp:            if k:                res += 1        return res

复杂度分析

时间复杂度O(nlglgn),空间复杂度O(n)

如何判断一个数是否为素数

  • 法一
    遍历2n1,看是否有数字能整除n。时间复杂度O(n)
  • 法二
    遍历2n,看是否有数字能整除n。时间复杂度O(logn)
  • 法三
    大于等于5的素数一定和6的倍数相邻。
    x1...,6x1,6x,6x+1,6x+2,6x+3,6x+4,6x+5,6(x+1),...,除6x16x+1都一定不是素数(因为都能找到约数)。那么我们就可以以6为步长,只判断6的倍数左右两侧的数,加快速度。

    class Solution:"""@param: head: a ListNode@return: a ListNode"""def isPrime(self, n):    if n is None or n < 2:        return False    if n == 2 or n == 3:        return True    if n % 6 != 1 and n % 6 != 5:        return False    i = 5    while i * i <= n:        if n % i == 0 or n % (i + 2) == 0:            return False        i += 6    return True
原创粉丝点击