兩個排序數組的中位數


中英題面

  給定兩個大小為 m 和 n 的有序數組 nums1 和 nums2 。

  There are two sorted arrays nums1 and nums2 of size m and n respectively.

  請找出這兩個有序數組的中位數。要求算法的時間復雜度為 O(log (m+n)) 。

  Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).

  示例 1:

    nums1 = [1, 3]
    nums2 = [2]

    中位數是 2.0

  Example 1:

    nums1 = [1, 3]
    nums2 = [2]

    The median is 2.0

  示例 2:

    nums1 = [1, 2]
    nums2 = [3, 4]
    中位數是 (2 + 3)/2 = 2.5

  Example 2:

    nums1 = [1, 2]
    nums2 = [3, 4]

    The median is (2 + 3)/2 = 2.5



算法

  將原題轉化為在兩個有序數列中查找第k小的元素。

  對於長度為m和n的兩個有序數列a和b,考慮0 < i < m和0 < j < n且i + j + 2 == k。

  若a[i] < b[j],則a[0..i]與b[j..(n – 1)]中比無所要查找的元素,將其刪去后更新k值遞歸處理。

  時間復雜度:

    O(log(M + N))

  空間復雜度:

    O(log(M + N))

 
代碼
 1 class Solution:  2     def findMedianSortedArrays(self, nums1, nums2):  3         """
 4  :type nums1: List[int]  5  :type nums2: List[int]  6  :rtype: float  7         """
 8         m = len(nums1)  9         n = len(nums2) 10         s = m + n + 1
11         return (self.findKth(nums1, nums2, s // 2) + self.findKth(nums1, nums2, s - s // 2)) / 2
12     
13     def findKth(self, nums1, nums2, k): 14         m = len(nums1) 15         n = len(nums2) 16         if (m < n): 17             return self.findKth(nums2, nums1, k) 18         if (not n): 19             return nums1[k - 1] 20         if (k == 1): 21             return min(nums1[0], nums2[0]) 22         mid1 = max(k * m // (m + n) - 1, 0) 23         mid2 = k - mid1 - 2
24         if (nums1[mid1] < nums2[mid2]): 25             return self.findKth(nums1[mid1 + 1 :], nums2[: mid2 + 1], k - mid1 - 1) 26         if (nums1[mid1] > nums2[mid2]): 27             return self.findKth(nums1[: mid1 + 1], nums2[mid2 + 1 :], k - mid2 - 1) 28         return nums1[mid1]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM