Python尋找兩個有序數(shù)組的中位數(shù)實例詳解
Python尋找兩個有序數(shù)組的中位數(shù)
審題:
1.找出意味著這是一個查找算法題
2.算法復(fù)雜度log級別,就是提示你是二分查找
3.二分查找實現(xiàn)一般為遞歸
(1)遞歸包括遞歸體
(2)終止條件
思路:
定理:
1.有序數(shù)組中有一半的元素小于等于數(shù)組的中位數(shù),有一半的元素大于等于中位數(shù)(如果數(shù)組中元素個數(shù)是奇數(shù),那么這里的一半并不是嚴(yán)格意義的1/2)
2.如果我們?nèi)サ羝渲幸粋€數(shù)組比中位數(shù)小的k個數(shù),再去掉另一個數(shù)組中比中位數(shù)大的k個數(shù),得到的合并子數(shù)組的中位數(shù)和原來的中位數(shù)相同。
eg:[1,2,3],[1,2,3] => [1,1,2,2,3,3]
根據(jù)定理去除元素[2,3],[1,2] => [1,2,2,3]中位數(shù)沒變。我用了特殊的例子解釋,你可以自行換一個試一試。如果兩個的數(shù)組長度不一樣的時候,不能去掉各自的一半,要去掉相同的個數(shù),下面會細(xì)說
解題思路:
假設(shè)兩個數(shù)組的中位數(shù)分別是a[m1],b[m2]
1.if a[m1] == b[m2] ,那么剛好有一半的元素小于a[m1],那么a[m1]就是要找的中位數(shù)。參考上面的列子
2.if a[m1] < b[m2],根據(jù)定理1可知,這個中位數(shù)只可能出現(xiàn)在a[n1/2 ~ n1-1]或者b[0 ~ n2/2].也就是說合并這兩個數(shù)組的中位數(shù)和原來的數(shù)組合并的數(shù)組的中位數(shù)是一樣的。 根據(jù)定理2可知:
1.數(shù)組長度一樣的時候,去除掉一半是合理的。
2.數(shù)組長度不一樣,這么做中位數(shù)可能發(fā)生變化。解決方案就是去除掉相同個數(shù)的元素。why?假設(shè)n1 < n2, 兩個數(shù)組就去掉n1/2個元素。那就不在是上面的范圍(a[n1/2 ~ n1-1]或者b[0 ~ n2/2]),而是a[n1/2 ~ n1-1]或者b[0 ~ (-n1/2+n2-1)].
結(jié)論就是:只能刪除a的n1/2(向下取整)
3.if a[m1] > b[m2],和上面分析類似,中位數(shù)只能出現(xiàn)在a的前半段或者b的后半段。也就是說a[0 ~ n1/2]和b[n1/2 ~ n2-1]的中位數(shù)和原來的中位數(shù)相同。
參考:LeetCode參考答案
class Solution: def findMedianSortedArrays(self, nums1, nums2): """ :type nums1: List[int] :type nums2: List[int] :rtype: float """ m, n = len(nums1), len(nums2) if m > n: nums1, nums2, m, n = nums2, nums1, n, m if n == 0: raise ValueError imin, imax, half_len = 0, m, (m + n + 1) // 2 while imin <= imax: i = (imin + imax) // 2 j = half_len - i if i < m and nums2[j-1] > nums1[i]: # i is too small, must increase it imin = i + 1 elif i > 0 and nums1[i-1] > nums2[j]: # i is too big, must decrease it imax = i - 1 else: # i is perfect if i == 0: max_of_left = nums2[j-1] elif j == 0: max_of_left = nums1[i-1] else: max_of_left = max(nums1[i-1], nums2[j-1]) if (m + n) % 2 == 1: return max_of_left if i == m: min_of_right = nums2[j] elif j == n: min_of_right = nums1[i] else: min_of_right = min(nums1[i], nums2[j]) return (max_of_left + min_of_right) / 2.0
總結(jié)
以上所述是小編給大家介紹的Python尋找兩個有序數(shù)組的中位數(shù),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
Django框架文件上傳與自定義圖片上傳路徑、上傳文件名操作分析
這篇文章主要介紹了Django框架文件上傳與自定義圖片上傳路徑、上傳文件名操作,結(jié)合實例形式分析了Django框架文件上傳的原理、步驟、實現(xiàn)方法以及圖片上傳時自定義上傳路徑、上傳文件名的相關(guān)操作技巧,需要的朋友可以參考下2019-05-05python計算階乘和的方法(1!+2!+3!+...+n!)
今天小編就為大家分享一篇python計算階乘和的方法(1!+2!+3!+...+n!),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-02-02python使用opencv對圖像添加噪聲(高斯/椒鹽/泊松/斑點)
這篇文章主要介紹了python使用opencv對圖像添加噪聲(高斯/椒鹽/泊松/斑點),具有一定的學(xué)習(xí)價值,需要的小伙伴可以參考一下,希望對你有所幫助2022-04-04python中的torch常用tensor處理函數(shù)示例詳解
這篇文章主要介紹了python中的torch常用tensor處理函數(shù),本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-07-07Python使用PyAudio制作錄音工具的實現(xiàn)代碼
這篇文章主要介紹了Python使用PyAudio制作錄音工具,音頻錄制與視頻錄制相似,也是以數(shù)據(jù)幀的方式錄制保存,這次使用強大的第三方包PyAudio和內(nèi)置的wave模塊編寫,需要的朋友可以參考下2022-04-04python實現(xiàn)不同數(shù)據(jù)庫間數(shù)據(jù)同步功能
這篇文章主要介紹了python實現(xiàn)不同數(shù)據(jù)庫間數(shù)據(jù)同步功能,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-02-02