4. Median of Two Sorted Arrays(topK-logk)
阿新 • • 發佈:2018-01-14
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)