1. 程式人生 > >4. Median of Two Sorted Arrays(topK-logk)

4. Median of Two Sorted Arrays(topK-logk)

div 發現 下標 ble exit 進行 排序 能夠 res

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

解析

  • 題目是這樣的:給定兩個已經排序好的數組(可能為空),找到兩者所有元素中第k大的元素。另外一種更加具體的形式是,找到所有元素的中位數。本篇文章我們只討論更加一般性的問題:如何找到兩個數組中第k大的元素?不過,測試是用的兩個數組的中位數的題目,Leetcode第4題 Median of Two Sorted Arrays

  • 方案1:假設兩個數組總共有n個元素,那麽顯然我們有用O(n)時間和O(n)空間的方法:用merge sort的思路排序,排序好的數組取出下標為k-1的元素就是我們需要的答案。
    這個方法比較容易想到,但是有沒有更好的方法呢?
  • 方案2:我們可以發現,現在我們是不需要“排序”這麽復雜的操作的,因為我們僅僅需要第k大的元素。我們可以用一個計數器,記錄當前已經找到第m大的元素了。同時我們使用兩個指針pA和pB,分別指向A和B數組的第一個元素。使用類似於merge sort的原理,如果數組A當前元素小,那麽pA++,同時m++。如果數組B當前元素小,那麽pB++,同時m++。最終當m等於k的時候,就得到了我們的答案——O(k)時間,O(1)空間。
  • 但是,當k很接近於n的時候,這個方法還是很費時間的。當然,我們可以判斷一下,如果k比n/2大的話,我們可以從最大的元素開始找。但是如果我們要找所有元素的中位數呢?時間還是O(n/2)=O(n)的。有沒有更好的方案呢?
  • 我們可以考慮從k入手。如果我們每次都能夠剔除一個一定在第k大元素之前的元素,那麽我們需要進行k次。但是如果每次我們都剔除一半呢?所以用這種類似於二分的思想

題目來源

  • 4. Median of Two Sorted Arrays
  • leetcode之 median of two sorted arrays
  • 【LeetCode】4. Median of Two Sorted Arrays (2 solutions)

4. Median of Two Sorted Arrays(topK-logk)