LeetCode 4 尋找兩個有序陣列的中位數

2021-09-29 02:04:20 字數 1910 閱讀 8636

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

請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o(log(m + n))。

你可以假設 nums1 和 nums2 不會同時為空。

示例 1:

nums1 = [1, 3]

nums2 = [2]

則中位數是 2.0

示例 2:

nums1 = [1, 2]

nums2 = [3, 4]

則中位數是 (2 + 3)/2 = 2.5

詳解:從有序陣列找出中位數,那什麼是中位數呢?

我們在衡量一組資料的時候,一般都根據平均數衡量(所有數的和除以數的個數)

但是有些場景,比如考完試需要衡量乙個班的水平。

假如此次考試a班11個人,其中10個考了100,99,98,97,96,95,94,93,92,91,還有乙個1個考了個0,那平均數是多少呢?86.8分。

還有b班也是11個人,他們都是考了86分。

這個時候哪個班強一些呢?實際感官肯定是a班,只是因為有個老鼠屎,才拉低了平均數,這個時候中位數就可能更好的衡量了。

將乙個班的分數排名之後,處於最中間的分數即為中位數,也就是a班中位數95,b班還是86。

好了不多說了,回歸題目。

可以簡單思考發現:

當個數n為奇數的時候,中位數就是第n/2 + 1位置的數

當個數n為偶數的時候,中位數就是第n/2和n/2 + 1位置的數的平均值

那這很明顯的可以看出來,這個題目是叫求第n/2和第n/2+1的數了

那自然延伸到兩個有序陣列求第k大的數

int findkthsmallestnum(int nums1, int start1, int nums2, int start2, int k)
當start1大於nums1的長度,那第k大就是nums2裡面的第k大

當start2大於nums2的長度,那第k大就是nums1裡面的第k大

為了求第k大,可以判斷nums1和nums2的前面第k/2大的數(下面會講為什麼),也就是x = nums1[start1 + k / 2]和y = nums2[start2 + k / 2]的大小.

x和y的較小者(假如為x)可以斷定第k大的數一定不在x所在陣列的前k/2個數中,因為這兩陣列分出的這兩段數剛好k個,第k大的如果在這裡面那也一定是x和y的較大者y。但是這個較大者y不一定是這個方法的結果,因為這個第k大的數還有可能在x所在陣列的後面,只是能確定第k大的數一定不在x所在陣列的前k/2個數中

那麼問題規模可以縮小到k的一半,直到k等於1(此時可以直接通過比較得出結果)

再詳細的思路也不及**片行,那直接貼**:

public double findmediansortedarrays(int nums1, int nums2) else

}public int findkthsmallestnum(int nums1, int start1, int nums2, int start2, int k)

if(start2 >= nums2.length)

if(k == 1)

int middle = k >> 1;

if(start1 + middle > nums1.length)else if(start2 + middle > nums2.length)else if(nums1[start1 - 1 + middle] < nums2[start2 - 1 + middle])else

}public int getmin(int a, int b)

最後貼效率:

LeetCode 4 尋找兩個有序陣列的中位數

給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0 示例 2 nums1 1,2 ...

LeetCode 4 尋找兩個有序陣列的中位數

給定兩個大小為 m 和 n 的有序陣列nums1和nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設nums1和nums2不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0示例 2 nums1 1,2 nums2 3,...

LeetCode4 尋找兩個有序陣列的中位數

給定兩個大小為 m 和 n 的有序陣列nums1和nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設nums1和nums2不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0示例 2 nums1 1,2 nums2 3,...