O N 的時間尋找第K大數 Python

2021-06-28 14:59:22 字數 1188 閱讀 7531

最近在學python,從基礎的語法學起,但是**這玩意,還是動手為佳,就從實現幾個簡單的演算法開始吧。

題目主要是從leetcode上面找,這題majority element想accepted是很容易的,比如直接sort,然後取第k大。我這裡利用快排的思想,演算法過程不難,就是實現起來中間有些小細節需要注意。快排本身的時間複雜度為o(nlogn),這裡主要是不需要對切割的兩個序列都進行排列,每次只排列乙個序列就可,所以平均的時間複雜度可以達到o(n)。

先貼題:

下面是**:

class

solution:

# @param num, a list of integers

# @return an integer

defmajorityelement

(self, num):

return self.select(num, 0, len(num)-1, len(num)/2)

defpartition

(self, num, l, r):

pivot = num[l]

i = l

j = r

while i < j:

while pivot < num[j] and i < j:

j -= 1

if i < j:

num[i] = num[j]

i += 1

while pivot > num[i] and i < j:

i += 1

if i < j:

num[j] = num[i]

j -= 1

num[i] = pivot

return i

defselect

(self,num,l,r,k):

if l == r:

return num[l]

i = self.partition(num,l,r)

j = i - l

if j == k:

return num[i] #分割完後,如果pivot剛剛好就是第k大,直接返回,否則還有兩種情況:

if(j < k):

return self.select(num, i+1, r, k-j-1)

else:

return self.select(num,l,i-1,k)

尋找第k大數字

sicily description 經過長時間的籌備工作,在jourk,ronny,plipala,阿長,阿沈等人的努力下,dm實驗室建立起自己的系列 其中包括三個大板塊 dmoj首頁 dmoj論壇 dmoj部落格。作為乙個大型的 資料的加工處理需要用到很多演算法系統模組,通過這些模組對系統主資料...

分治演算法 尋找第k大數

問題描述 給定線性序集中n個元素和乙個整數k,1 k n,要求找出這n個元素中第k大的元素,這裡給定的線性集是無序的 其實這個問題很簡單,直接對線性序列集qsort,再找出第k個即可。但是這樣的時間複雜度就是qsort的時間複雜度o nlogn 有沒有更快的方法呢?看到網上有一種解法是採取了快排的思...

分治演算法 尋找第k大數

問題描述 給定線性序集中n個元素和乙個整數k,1 k n,要求找出這n個元素中第k大的元素,這裡給定的線性集是無序的 其實這個問題很簡單,直接對線性序列集qsort,再找出第k個即可。但是這樣的時間複雜度就是qsort的時間複雜度o nlogn 有沒有更快的方法呢?看到網上有一種解法是採取了快排的思...