最近在學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 有沒有更快的方法呢?看到網上有一種解法是採取了快排的思...