【python學習記錄4】Median of Two Sorted Arrays

問題描述

There are two sorted arrays nums1 and nums2 of size m and n respectively.
Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).

Example 1:

nums1 = [1, 3]
nums2 = [2]
The median is 2.0

Example 2:

nums1 = [1, 2]
nums2 = [3, 4]
The median is (2 + 3)/2 = 2.5

詳細問題

代碼實現

class Solution(object):
    def findMedianSortedArrays(self, nums1, nums2):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: float
        """
        n1,n2  = len(nums1), len(nums2)
        if n1 > n2:
            nums1, nums2, n1, n2 = nums2, nums1, n2, n1 #讓nums2和n2更大

        imin, imax, half_len = 0, n1, (n1 + n2 + 1) // 2 #若為奇數,中位數算入half_len即左側
        while imin <= imax: #二分查找的標準循環條件
            i = (imin + imax) // 2 #二分查找標準迭代條件.i為nums1分入左側的個數
            j = half_len - i # j為nums2分入左側的個數
            if j > 0 and i < n1 and nums1[i] < nums2[j-1]: # i太小
                imin = i + 1
            elif i > 0 and j < n2 and nums1[i-1] > nums2[j]: # i太大
                imax = i - 1
            else:
                # 結果已經得出
                if i == 0: max_of_left = nums2[j-1] #所有的nums1大于nums2
                elif j == 0: max_of_left = nums1[i-1]
                else: max_of_left = max(nums1[i-1], nums2[j-1])

                if (n1 + n2) % 2 == 1: #如果總數為奇數 中位數在half_len末尾即左側末尾
                    return max_of_left

                if i == n1: min_of_right = nums2[j]
                elif j == n2: min_of_right = nums1[i]
                else: min_of_right = min(nums1[i], nums2[j])

                return (max_of_left + min_of_right) / 2.0

經驗總結

  • python中nums1, nums2, n1, n2 = nums2, nums1, n2, n1的交換方式非常方便
  • 中位數的核心思想是劃分等大的兩類,讓左側最大值小于右側最小值。利用這點將兩list聯系在一起,統一移動
  • 尋找有序數列中的特定單個值,用二分查找
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容