O(N)的時間尋找第K大數——Python
阿新 • • 發佈:2018-12-31
最近在學Python,從基礎的語法學起,但是程式碼這玩意,還是動手為佳,就從實現幾個簡單的演算法開始吧。
題目主要是從leetcode上面找,這題Majority Element想accepted是很容易的,比如直接sort,然後取第K大。我這裡利用快排的思想,演算法過程不難,就是實現起來中間有些小細節需要注意。快排本身的時間複雜度為O(NlogN),這裡主要是不需要對切割的兩個序列都進行排列,每次只排列一個序列就可,所以平均的時間複雜度可以達到O(N)。
先貼題:
Given an array of size n, find the majority element. The majority element is the element that appears more than ⌊ n/2 ⌋ times.
You may assume that the array is non-empty and the majority element always exist in the array.
下面是程式碼:
class Solution:
# @param num, a list of integers
# @return an integer
def majorityElement(self, num):
return self.select(num, 0, len(num)-1, len(num)/2)
def partition(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
def select(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)