1. 程式人生 > >O(N)的時間尋找第K大數——Python

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

最近在學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)