標籤:
題目描述:給定一個未排序的整數數組,找到其中位元。中位元是排序後數組的中間值,如果數組的個數是偶數個,則返回排序後數組的第N/2個數。
範例:給出數組[4, 5, 1, 2, 3], 返回 3;給出數組[7, 9, 4, 5],返回 5
目的是要找到排在最中間的那個數。這不由使人回想起快速排序,快排每次都是令樞軸排在它該排在的位置。而其他位置的元素未必是排好序的。
那麼我們可以這樣來思考,如果說現在將任意元素作為樞軸,執行快排中的分割程式(關於快排,詳見:點擊開啟連結),如果樞軸所在的位置恰好是中間,那麼樞軸就是中位元了,同理,如果樞軸在中間位置之前,則說明中位元一定比樞軸大,在樞軸後面的數組中出現,而如果樞軸在中間位置之後,則說明中位元一定比樞軸小,在樞軸前面的數組中出現。這是什麼思想,二分法。所以這道題就是快排的技術,結合了一點點“二分”的思想。
所以,可以這樣來設計,先設計一個函數,和快排中的分割函數的作用一樣,取數組第一個元素作為樞軸,使得大於樞軸的元素排在樞軸後面,小於的排樞軸前面。不同的是,還要返回一個樞軸所在的位置資訊,我們才能比較這個位置和中間位置的前後關係。
1. 如果就是中間位置,返回樞軸即可
2. 在中間位置前,用分割函數運行樞軸後面的數組,得到一個位置,再和中間位置比較
3. 在中間位置後,用分割函數運行樞軸前面的數組,得到一個位置,再和中間位置比較
代碼如下:
class Solution: """ @param nums: A list of integers. @return: An integer denotes the middle number of the array. """ def median(self, nums): n = len(nums) if n <= 1: return nums[0] begin, end = 0, n - 1 index = self.partition(nums, begin, end) while index != (n - 1) // 2: if index < (n - 1) // 2: begin = index + 1 self.partition(nums, begin, end) else: end = index - 1 self.partition(nums, begin, end) return nums[index] def partition(self, nums, begin, end): pivot = nums[begin] index = begin for i in range(begin + 1, end + 1): if nums[i] < pivot: index += 1 nums[i], nums[index] = nums[index], nums[i] nums[begin], nums[index] = nums[index], nums[begin] return index # write your code here
partition為分割函數,之前講過太多遍了。需要注意這種begin和end的應用
中位元