給定兩個有序陣列,找出合併之後的陣列中位數

2021-07-11 02:05:24 字數 1443 閱讀 7571

中位數定義:假如乙個陣列的長度len為偶數,那麼中位數為第 len/2 個數;如果len為奇數,那麼中位數為第len/2+1個數。

比如 arr[ 1, 2, 3, 4, 5]中位數為3;arr[ 2, 3, 4, 5]中位數為3。

給定兩個遞增排序陣列,請設計一種高效演算法求出兩個陣列的中位數。

比如 a[ 1, 2, 3, 4, 5] 

b[ 2, 3, 4, 5]

那麼中位數為3。

如何來求中位數呢?中位數是排序之後中間的那個數。比如 [ 2, 3, 4, 5, 6]中位數為4,

關鍵點:假如每次分別去掉中位數的最左邊和最右邊相同個數的數,那麼中位數還是剩下元素的中位數。

首先我們先來分別假設a的中位數為midnum1, b的中位數為midnum2。

...............midnum1.............

.....................midnum2.....................

假設midnum1如果你明白了上面的說辭,那麼好我們就要來思考乙個問題。丟棄的數的個數是否剛剛好數偶數,假如不是的話我們應該還要再丟掉乙個數。上面假設的條件是midnum1來個實際的例子:

a[ 1, 2, 3, 4, 5] 

b[ 2, 3, 4, 5]

陣列a                陣列b          中位數   中位數

初始 1  2  3  4  5              2  3  4  5           3           3

4 5                      2  3                  4           2   

4                           3                   4           3

最後我們取最小的那個數即可,這裡也就是3。

當midnum1>midnum2時,只需要把上面的情況反過來即可。也就是陣列「交換掉」,把變數名改改即可。

還有一種情況midnum1==midnum2時,那麼容易得出a[midnum1]就是中位數。兩個陣列的中位數相等,那麼合併之後的陣列的中位數仍然是該數,這個應該很容易理解。

接著就是看**吧。

/***

* @param arr1 公升序陣列1

* @param arr2 公升序陣列2

* @return 兩個陣列的中位數

*/public static int middlenumberoftwoarr(int arr1,int arr2){

int start1= 0;

int start2= 0;

int end1 = arr1.length-1;

int end2 = arr2.length-1;

int midindex1;

int midindex2;

while(start1

合併兩個有序陣列

例如 陣列a1 陣列a2 則合併為a3 思路 依次掃瞄a1和a2的元素 比較當前元素的值,將較小的元素賦給a3,直到乙個陣列掃瞄完畢,然後將另乙個陣列的剩餘元素賦給a3即可。陣列a3的容量需要容納a1和a2兩個陣列和長度和。實現 include include void merge int a1,i...

合併兩個有序陣列

給定兩個有序整數陣列 nums1 和 nums2,將 nums2 合併到 nums1 中,使得 num1 成為乙個有序陣列。說明 示例 輸入 nums1 1,2,3,0,0,0 m 3 nums2 2,5,6 n 3 輸出 1,2,2,3,5,6 class solution def merge s...

合併兩個有序陣列

題目描述 給定兩個有序整數陣列 nums1 和 nums2,將 nums2 合併到 nums1 中,使得 num1 成為乙個有序陣列。說明 初始化 nums1 和 nums2 的元素數量分別為 m 和 n。你可以假設 nums1 有足夠的空間 空間大小大於或等於 m n 來儲存 nums2 中的元素...