1. 程式人生 > >Python 刷題日記:LeetCode 204: Count Primes

Python 刷題日記:LeetCode 204: Count Primes

原題:
Description:

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

解題思路:

常規解法:

因為要求解小於n的素數個數,首先要解決如何判斷一個素數。那麼就是對於一個數x,只需對[2,這裡寫圖片描述]的數進行整除,若能整除則不是素數,不能整除則為素數。然後判斷小於n的各個數是否為素數,這樣做法的複雜度顯然為O(n^2),在LeetCode中肯定TLE。

def countPrimes(n):
    import math

    count=0

    def judge_prime
(w):
sqrt_w=int(math.sqrt(w)) for i in xrange(2,sqrt_w+1): if x%i==0: return 0 return 1 for x in xrange(2,n): count=count+judge_prime(x) return count

沒辦法了我就去Google了一下,於是知道了厄拉多塞篩法:

西元前250年,希臘數學家厄拉多塞(Eeatosthese)想到了一個非常美妙的質數篩法,減少了逐一檢查每個數的的步驟,可以比較簡單的從一大堆數字之中,篩選出質數來,這方法被稱作厄拉多塞篩法(Sieve of Eeatosthese)

具體操作:先將 2~n 的各個數放入表中,然後在2的上面畫一個圓圈,然後劃去2的其他倍數;第一個既未畫圈又沒有被劃去的數是3,將它畫圈,再劃去3的其他倍數;現在既未畫圈又沒有被劃去的第一個數 是5,將它畫圈,並劃去5的其他倍數……依次類推,一直到所有小於或等於 n 的各數都畫了圈或劃去為止。這時,表中畫了圈的以及未劃去的那些數正好就是小於 n 的素數。

其實,當你要畫圈的素數的平方大於 n 時,那麼後面沒有劃去的數都是素數,就不用繼續判了。如下圖:

python改進版:

從上面的厄拉多塞篩法可以看出,我們只需遍歷[2,這裡寫圖片描述],因為超過這裡寫圖片描述部分如果不是素數,則作為因子在前面的數已經被刪除了。同時這裡利用了python裡list的特性[::i]取i的倍數。

def countPrimes(self, n):
    if n < 3:
        return 0
    primes = [True] * n
    primes[0] = primes[1] = False
    for i in range(2, int(n ** 0.5) + 1):
        if primes[i]:
            primes[i * i: n: i] = [False] * len(primes[i * i: n: i])
    return sum(primes)

相關推薦

Python 日記LeetCode 204: Count Primes

原題: Description: Count the number of prime numbers less than a non-negative number, n. 解題思路: 常規解法: 因為要求解小於n的素數個數,首先要解決如何判斷

Python 日記LeetCode 5&9&516- Longest Palindromic Substring 集合

原題:LeetCode 5 Longest Palindromic Substring: Given a string s, find the longest palindromic substring in s. You may assume that

python日記劍指offer-調整陣列順序使奇數位於偶數前面

輸入一個整數陣列,實現一個函式來調整該陣列中數字的順序,使得所有的奇數位於陣列的前半部分,所有的偶數位於位於陣列的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。 解題思路 傳統方法應該是給兩個一前一後指標,遇到前偶數與後奇數時,就交換。然而我發現一個更簡便的方法,就是給兩個列表,奇偶分開放,最後

【本人禿頂程式設計師】LeetCode演算法-Valid Anagram

←←←←←←←←←←←← 我都禿頂了,還不點關注! 今天介紹的是LeetCode演算法題中Easy級別的題。給定兩個字串s和t,寫一個函式來確定t是否是s的anagram。例如: 輸入:s =“anagram”,t =“nagaram” 輸出:true 輸入:s =“rat”,t

[leetcode] 204. Count Primes @ python

原題 https://leetcode.com/problems/count-primes/ Count the number of prime numbers less than a non-negative number, n. Example: Input: 10 Ou

筆記leetcode第5Longest Palindromic Substring

記錄一下~~    作者刷leetcode刷到吐血,第五題感覺沒有太好的官方解決方法,我是這麼做的    問題:    思路:由於字串可能很大,消耗計算量的做法肯定是不能用的,最後只遍歷一次,找出所有迴文        1、遍歷每個字元       2、每次得到字元後,再迴圈

[leetcode-204-Count Primes]

class i++ color code tor div 開始 ima log Description:Count the number of prime numbers less than a non-negative number, n. 思路: 參考http://ww

leetcode 204. Count Primes

img ++ color 所有 ret count eof src rime 題目描述 註意:1既不是素數也不是合數 可以通過標記的方法找到所有非素數。 class Solution { public: int countPrimes(int n) {

leetcode-204-Count Primes

() tps data- top weight 般的 dsm get lin Count Primes Description: Count the number of

[LeetCode] 204. Count Primes 計數質數

inf function wikipedia rip end cto ins java 自然 Description: Count the number of prime numbers less than a non-negative number, n click

[LeetCode] 204. Count Primes

NPU style 應該 pre class i++ less esc int 204. Count Primes Count the number of prime numbers less than a non-nega

[leetcode]204.Count Primes

mes solution The 數組 count prime otp num xpl 題目 Count the number of prime numbers less than a non-negative number, n. Example: Input: 10 O

leetcode:(204) Count Primes(java)

package LeetCode_HashTable; /** * 題目: * Count the number of prime numbers less than a non-negative number, n. * Example: * Inp

#Leetcode# 204. Count Primes

n) code ret tps target rim HERE n-n ++ https://leetcode.com/problems/count-primes/ Count the number of prime numbers less than a non-ne

LeetCode 204.Count Primes (計數質數)

題目描述: 統計所有小於非負整數 n 的質數的數量。 示例: 輸入: 10 輸出: 4 解釋: 小於 10 的質數一共有 4 個, 它們是 2, 3, 5, 7 。   AC C++ Solution: 解題思路:首先排除2之外的所有偶數,2預設

LeetCode - 204 Count Primes & 611 - Valid Triangle Number

LeetCode - 204 Count Primes & 611 - Valid Triangle Number LeetCode - 204 Count Primes LeetCode - 611 - Valid Triangle Number

LeetCode: 204. Count Primes判斷是否為素數的高效方法

連結: https://leetcode.com/problems/count-primes/#/description Description: Count the number of prime

LeetCode 204. Count Primes(C++版)

Description: Count the number of prime numbers less than a non-negative number, n. 思路分析: 方法一:我們知道大於2的偶數肯定不是素數。所以遍歷小於n的奇數,判斷是否為素數,是,cou

LeetCode & 劍指offer】特殊數3204 Count Primes

【LeetCode & 劍指offer 刷題筆記】目錄(持續更新中...) 204. Count Primes Count the number of prime numbers less than a non-negative numbe

Leetcode日記32. 最長有效括號 (PYTHON)

給定一個只包含 ‘(’ 和 ‘)’ 的字串,找出最長的包含有效括號的子串的長度。 示例 1: 輸入: “(()” 輸出: 2 解釋: 最長有效括號子串為 “()” 示例 2: 輸入: “)()())” 輸出: 4 解釋: 最長有效括號子串為 “()()” 沒看清題目就寫,以為是求輸入