【LeetCode】004.兩個排序陣列的中位數
阿新 • • 發佈:2018-12-14
兩個排列陣列的中位數
問題描述:
給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2 。 請找出這兩個有序陣列的中位數。要求演算法的時間複雜度為 O(log (m+n)) 。 你可以假設 nums1 和 nums2 不同時為空。
示例:
nums1 = [1, 3]; nums2 = [2]; 中位數是 2.0 nums1 = [1, 2]; nums2 = [3, 4]; 中位數是 (2 + 3)/2 = 2.5
思路分析:
中位數:把一個數組分成兩部分,左邊最大的數應該小於右邊最小的數。陣列1和陣列2的長度分別為m,n,一般的長度為(m+n)/2
,即m/2+n/2
,所以可以直接把陣列1的前半部分和陣列2的前半部分合並,陣列1和陣列2的後半部分合並,然後前半部分的最大值小於等於後半部分的最小值,即可求出中位數,關係式如下:
j + i = (m + n) / 2 && max(nums1[j - 1) nums2[i - 1]) <= min(nums[j] nums[i])
- 如果
nums1[j-1] > nums2[i]
,這時候我們可以理解為,陣列1的左邊有資料過大,所以我們必須把這個大數給 右邊,但是這樣就會產生左邊的總數少了,那我們就把陣列2右邊的給左邊一個就行了。所以左邊合起來的總是依舊等於右邊合起來的總數 - 同理,如果
nums2[i-1] > nums1[j]
,就把nums2[i-1]
送給右邊同時把nums1[j]
送給左邊就行。
程式碼實現:
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @return {number}
*/
var findMedianSortedArrays = function(nums1, nums2) {
var result = [];
while (nums1.length > 0 && nums2.length > 0) {
if (nums1[0] < nums2[0]) {
result.push(nums1.shift());
} else {
result.push(nums2.shift());
}
}
var res = result.concat(nums1, nums2);
var middle = Math.floor(res.length / 2);
if (res.length % 2) {
return res[middle];
} else {
return (res[middle - 1] + res[middle]) / 2;
}
};