題目描述:
計算兩個有序陣列的中位數,至少乙個陣列不為空。要求時間複雜度o(log(m+n)),m、n分別為兩個陣列的長度。
如: 輸出應為2
輸出應為2.5
題目分析:
時間複雜度要求為log級別,陣列又都是有序的,容易聯想到二分,每次比較去掉一部分元素。
陣列中位數第一反應是需要分奇偶。奇數的話,我們只需要找到兩個陣列長度的中間那個下標元素即可,偶數則需要求個平均,因此問題的關鍵轉化為了查詢兩陣列的第k小元素。
第乙個陣列aa,第二個陣列bb。找第k小元素,需要分別在兩個陣列中找到某個元素(第a、b個元素),滿足a+b=k,且aa[a]>=bb[b-1]、bb[b]>=aa[a-1]。我們假設第乙個陣列長度小於第二個陣列(否則交換下),如果前乙個陣列為空,那直接去後者的第k個元素即可;如果k為1(k不可能為0,因為題目規定至少乙個陣列不為空),取兩陣列第乙個元素最小值即可(第乙個陣列長度小於第二個陣列,因此第乙個陣列不為空,後者也不會為空);比較aa中第k/2的元素和滿足取k個元素的bb中對應的元素,較小的元素對應的陣列的左半部分即可捨去(因為它們肯定是前k-1小中的元素),捨去這a(或b)個元素的同時,我們的尋找目標就變成了再剩餘陣列中找第k-a(或k-b)小元素。如此遞迴。
#include#includeusing namespace std;
//計算兩個已排好序的陣列的中位數
double findmediansortedarrays(vector& a, vector& b);
int main()
; int b = ;
vectornums1(a,a+sizeof(a)/sizeof(int));
vectornums2(b,b+sizeof(b)/sizeof(int));
cout<& aa, vector& bb, int k)
else if(aa[a-1]>bb[b-1])
else
return aa[a-1];
}double findmediansortedarrays(vector& nums1, vector& nums2)
兩個有序陣列中位數
大小m和n分別有兩個排序陣列a和b。找到兩個排序陣列的中值。總的執行時間複雜度應該是o log m n class solution return findkth a,b,0,0,m,n,s 2 findkth a,b,0,0,m,n,s 2 1 2 private double findkth v...
兩個有序陣列中位數
首先我們可以不斷分割得到這個kkk。首先兩個陣列都分配k 2 frac 2k 如果第k 2 frac 2k 個數,第乙個陣列小於第二個陣列,那麼第乙個陣列的k 2 frac 2k 個數一定不是答案。問題可以變成乙個子問題,上乙個陣列從k2 1 frac 1 2k 1開始。相當於我們每次要去掉k 2 ...
兩個有序陣列的中位數
問題一 兩個有序陣列,且長度都為n。找出中位數。解決這個問題的方法很多。方法一 基於歸併排序的merge方法。找出兩個陣列中第n大的數和第n 1大的數,然後求它們的平均數。時間複雜度為o n 方法二 比較兩個陣列中的中位數的大小。每一次比較都能縮小兩個陣列的搜尋範圍。時間複雜度為o nlgn pub...