中位元

來源:互聯網
上載者:User

標籤:

題目描述:給定一個未排序的整數數組,找到其中位元。中位元是排序後數組的中間值,如果數組的個數是偶數個,則返回排序後數組的第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的應用

中位元

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.