兩個有序陣列的中位數

2021-08-27 10:13:44 字數 2062 閱讀 9883

問題一:兩個有序陣列,且長度都為n。找出中位數。

解決這個問題的方法很多。

方法一:基於歸併排序的merge方法。找出兩個陣列中第n大的數和第n+1大的數,然後求它們的平均數。時間複雜度為o(n)。

方法二:比較兩個陣列中的中位數的大小。每一次比較都能縮小兩個陣列的搜尋範圍。時間複雜度為o(nlgn)。

public static double findmedianinsamelength(

int a, int la, int ra, int b, int lb,int rb)

int ma = la + (ra - la)/2;

int mb = lb + (rb - lb + 1)/2;

if ((ra - la) == 1 && (rb - lb) == 1)

if (a[ma] > b[mb])

if (a[ma] < b[mb])

return a[ma];

} private static int min(int i, int j)

private static int max(int i, int j)

方法三:基於二分搜尋的方法。

public static double findmedianwithbinarysearch(int a, int b) 

if (a[0] >= b[b.length - 1])

return findmediancore(a, 0, a.length - 1, b); }

private static double findmediancore(

int a, int left, int right, int b)

int n = (a.length + b.length)>>1;

int i = left + ((right - left)>>1);

int j = n - i - 1;

if (a[i] == b[j])

else if (a[i] > b[j] && (j == b.length - 1 || a[i] <= b[j+1]))

else

}else

}else if (a[i] > b[j] && j != b.length - 1 && a[i] > b[j+1])

else }

private static boolean isodd(int a, int b)

問題二:假如兩個有序陣列的長度不同。找出中位數。

這個問題同樣可以用問題一中的方法三來解決。

public static double findmedian(int a, int b) else 

}else else if (a.length < b.length) else }}

if (a[0] >= b[b.length - 1]) else

}else else if (a.length > b.length) else

}} return findmediancore(a, 0, a.length - 1, b);

}private static double findmediancore(

int a, int left, int right, int b)

int n = (a.length + b.length)>>1;

int i = left + ((right - left)>>1);

int j = n - i - 1;

if (a[i] == b[j])

else if (a[i] > b[j] && (j == b.length - 1 || a[i] <= b[j+1]))

else

}else

}else if (a[i] > b[j] && j != b.length - 1 && a[i] > b[j+1])

else }

private static boolean isodd(int a, int b)

兩個有序陣列中位數

大小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 ...

兩個有序陣列的中位數

o logn 兩種方法 一 二分查詢 中位數只有乙個,它前面有 c m n 1 2 個數比它小。中位數要麼出現在陣列a中,要麼出現在陣列b中,我們先從陣列a開始找。考察陣列a中的乙個元素a p 在陣列a中,有 p 個數比a p 小,如果陣列b中恰好有 c p 個數比 a p 小,則倆陣列合併後就恰好...