中位數定義:假如乙個陣列的長度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 中的元素...