7、Median of Two Sorted Arrays(Hard)

Problem Description

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)).

Analyze

total = nums1.count + nums2.count
若total為奇數,median為數組并集的第total/2個元素;
若為偶數,則median =(并集的第total/2個元素+第(total/2+1)個元素 ) / 2

利用遞歸函數獲取第兩數組并集的第k個元素大小
假設k為偶數,
若nums1[k/2-1] > nums2[k/2-1],則排除nums2的前k/2個元素,k -= k/2-1。
若nums1[k/2-1] < nums2[k/2-1],則排除nums1的前k/2個元素,k -= k/2-1。
依照這個原則遞歸,排除兩數組并集的前k-1個元素,從而獲得第k個元素大小

遞歸函數終止條件:

  • 當 nums1或 nums2為空時,分別返回 nums1[k-1]和nums2[k-1];
  • 當 k=1 是,返回 min(nums1[0], nums2[0]);
  • 當 nums1[k/2-1]==nums2[k/2-1] 時,返回 ?nums1[k/2-1]或nums2[k/2-1]

Code

class Solution {
    func findMedianSortedArrays(nums1: [Int], _ nums2: [Int]) -> Double {
        
        func find_kth(k: Int, nums1: [Int], nums2: [Int]) -> Double? {
         
            if k > nums1.count + nums2.count { return nil }
            // 令nums1元素的個數總是小等于nums2
            if nums1.count > nums2.count { return find_kth(k, nums1: nums2, nums2: nums1) }
            
            if nums1.count == 0 { return Double(nums2[k-1]) }
            
            if k == 1 { return Double(min(nums1[0], nums2[0])) }
            
            let i1 = min(k/2, nums1.count), i2 = k - i1
            print(nums1[i1-1], nums2[i2-1])
            if nums1[i1-1] < nums2[i2-1] {
                var nums1 = nums1
                nums1.removeRange(0..<i1)
                return find_kth(k-i1, nums1: nums1, nums2: nums2)
            }
            else if nums1[i1-1] > nums2[i2-1] {
                var nums2 = nums2
                nums2.removeRange(0..<i2)
                return find_kth(k-i2, nums1: nums1, nums2: nums2)
            }
            else {
                return Double(nums1[i1-1])
            }
        }
        
        let total = nums1.count + nums2.count
        if total % 2 != 0 {
            return find_kth(total / 2 + 1, nums1: nums1, nums2: nums2)!
        }
        else {
            return (find_kth(total / 2, nums1: nums1, nums2: nums2)! + find_kth(total / 2 + 1, nums1: nums1, nums2: nums2)! ) / 2.0
        }
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容