給定兩個大小為 m 和 n 的正序(從小到大)陣列nums1
和nums2
找出並返回這兩個正序陣列的中位數
時間複雜度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為奇數,...