求兩有序陣列的中位數

2021-10-25 04:21:37 字數 1348 閱讀 1308

給定兩個大小為 m 和 n 的正序(從小到大)陣列nums1nums2

找出並返回這兩個正序陣列的中位數

時間複雜度o(log(m+n))

解法:二分法查詢

public class main ;

int nums2 = ;

system.out.println("mid "+solution.method(nums1, nums2)); }}

class solution

else

} else if (length2 == 0)

else

} else

} /*

假設兩個陣列的長度分別為m和n, 兩陣列歸併之後, 陣列a的[0,i)個元素位於中位數左側, (i,m]的元素位於中位數右側

陣列b的[0,j)個元素位於中位數左側, (j,n]的元素位於中位數右側(a[i]和b[j]的相對位置還需進一步確定), 則有

(i+j) = (m+n+1)/2

其中m+n+1是為了解決m+n不是偶數的情況.

基於上述結論, 只要對其中乙個陣列使用二分查詢出i, 即可根據j = (m+n+1)/2-i計算出j

假設中間位置左側的最大值為maxleft, 右側的最大值為minright

其中有2種情況需要特殊處理:

a. a所有元素都》=中位數, 此時i=0

b. b所有元素都》=中位數, 此時j=0

*/ private double binaryserchmid(int nums1,int nums2)

int mida = 0;

int midb = 0;

/* 二分法的左邊界和右邊界 */

int left = 0, right = length1;

/* 兩陣列按序合併後的中間兩個數為maxleft和minright */

int maxleft = 0, minright = 0;

while (left <= right)

else if ((mida > 0) && (nums1[mida-1] > nums2[midb]))

else

} if (mida == 0)

else if (midb == 0)

else

if ((length1+length2)%2 != 0)

else

else if (midb == length2)

else

return (maxleft+minright)/2.0;

} }}

輸出:

6.0

求兩個有序陣列的中位數

要求 給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 例如 nums1 1,3 nums2 2 則中位數是 2.0 nums1 1,2 nums2 3,4 則中位數是 2 3 2 2.5 演算法解析...

求兩個有序陣列的中位數

原部落格 設陣列a的長度為m,陣列b的長度為n,兩個陣列都都是遞增有序的。求這兩個陣列的中位數 首先我們看看中位數的特點,乙個大小為n的陣列,如果n是奇數,則中位數只有乙個,陣列中恰好有 n 1 2 個元素比中位數小。如果n是偶數,則中位數有兩個 下中位數和上中位數 這裡我們只求下中位數,對於下中位...

求兩個等長有序陣列的中位數

設兩個有序陣列的長度均為n,求它們組成的2n長的陣列的中位數。首先說明下中位數的定義 統計學名詞,當變數值的項數n為奇數時,處於中間位置的變數值即為中位數 當n為偶數時,中位數則為處於中間位置的2個變數值的平均數。中位數有個性質 在中位數兩側去掉任意數量的數後,中位數不變 為了簡化,先假設n為奇數,...