Median of Two Sorted Arrays
problem:
There are two sorted arrays?nums1?and?nums2?of size m and n respectively.
有兩個(gè)排序好的數(shù)列num1和num大小為m和n
Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).
找到這兩個(gè)數(shù)列中的中位數(shù),其時(shí)間復(fù)雜度為O(log(m+n))
Example 1:
nums1 = [1, 3] nums2 = [2]The median is 2.0Example 2:
nums1 = [1, 2] nums2 = [3, 4]The median is (2 + 3)/2 = 2.5solution:
中位數(shù):就是有序數(shù)列中的一個(gè)數(shù)可以將數(shù)列分為長(zhǎng)度相同的兩個(gè)部分,且一個(gè)部分的所有值都大于這個(gè)數(shù),另一部分的所有值都小于這個(gè)數(shù),我們稱(chēng)這個(gè)數(shù)為中位數(shù)
?
既然是要找到中位數(shù),那么正常遇到這種題,歸并排序后再通過(guò)判斷偶數(shù)和奇數(shù)來(lái)輸出中位數(shù)就可以了,但是其時(shí)間復(fù)雜度并不符合要求
但是我們發(fā)現(xiàn)題目給出的兩個(gè)數(shù)列是有序的,那么我們可以根據(jù)這個(gè)來(lái)進(jìn)行劃分,首先我們已知中位數(shù)可以將所有數(shù)列都分為長(zhǎng)度相同的兩個(gè)部分,那么我們可以假設(shè)
m+n/2為其中一半的長(zhǎng)度,假設(shè)在num1這個(gè)數(shù)列中選取第i個(gè)數(shù),那么對(duì)應(yīng)的num2數(shù)列選取j個(gè)
其i,j滿(mǎn)足i+j = m-i+n-j
那么j = (m+n)/2-i
當(dāng)num1的第i+1個(gè)數(shù)小于num2的第j個(gè)數(shù)的時(shí)候說(shuō)明i應(yīng)該向右側(cè)移動(dòng)
當(dāng)num2的第j+1個(gè)數(shù)小于num1的第i個(gè)數(shù)的時(shí)候說(shuō)明i應(yīng)該向左側(cè)移動(dòng)
于此同時(shí)所謂的移動(dòng)其實(shí)是用的二分法,對(duì)num1進(jìn)行二分,尋找i的最合適的位置
最合適也就是,只需要滿(mǎn)足num1的第i+1個(gè)數(shù)大于num2的第j個(gè),和num2的第j+1個(gè)大于num1的第i個(gè)
?
如果n+m為奇數(shù),說(shuō)明中位數(shù)為max(num1的第i個(gè),num2第j個(gè))
如果n+m為偶數(shù),說(shuō)明中位數(shù)為(max(num1的第i個(gè),num2第j個(gè))+min(num1的第i+1個(gè),num2第j+1個(gè)))/2
代碼如下:
1 class Solution(object): 2 def findMedianSortedArrays(self, nums1, nums2): 3 """ 4 :type nums1: List[int] 5 :type nums2: List[int] 6 :rtype: float 7 """ 8 9 m = len(nums1) 10 n = len(nums2) 11 if(m>n): 12 nums1,nums2,m,n = nums2,nums1,n,m 13 imin = 0 14 imax = m 15 halflen = (n+m+1)/2 16 while(imin <= imax): 17 i = (imin+imax)/2 18 j = halflen - i 19 if(i<imax and nums1[i]<nums2[j-1]): 20 imin = i+1 21 elif(i>imin and nums2[j]<nums1[i-1]): 22 imax = i-1 23 else: 24 maxleft = 0 25 if(i==0): 26 maxleft = nums2[j-1] 27 elif(j==0): 28 maxleft = nums1[i-1] 29 else: 30 maxleft = max(nums1[i-1],nums2[j-1]) 31 if((n+m)%2==1): 32 return maxleft 33 minright = 0 34 if(i == m): 35 minright = nums2[j] 36 elif(j == n): 37 minright = nums1[i] 38 else: 39 minright = min(nums1[i],nums2[j]) 40 41 return (minright+maxleft)/2.0?
轉(zhuǎn)載于:https://www.cnblogs.com/fzy0331-leetcodestudy/p/8406562.html
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專(zhuān)家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的Median of Two Sorted Arrays的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 现实与理想
- 下一篇: whoosh----索引|搜索文本类库