1. 程式人生 > >【LeetCode】004.兩個排序陣列的中位數

【LeetCode】004.兩個排序陣列的中位數

兩個排列陣列的中位數

問題描述:

給定兩個大小為 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; } };