4. 寻找两个正序数组的中位数
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 O(log (m+n)) 。
示例 1:
输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2
示例 2:
输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5
提示:
nums1.length == m
nums2.length == n
0 <= m <= 1000
0 <= n <= 1000
1 <= m + n <= 2000
-106 <= nums1[i], nums2[i] <= 106
方法一:二分法
1 /** 2 * @param {number[]} nums1 3 * @param {number[]} nums2 4 * @return {number} 5 */ 6 var findMedianSortedArrays = function(nums1, nums2) { 7 let len1=nums1.length,len2 =nums2.length; 8 if(len1>len2) return findMedianSortedArrays(nums2,nums1);//对nums1和nums2中长度较小的二分 9 let len =len1+len2;//总长 10 let start =0,end=len1;//进行二分的开始和结束位置 11 let partLen1,partLen2 12 while(start<=end){ 13 partLen1=(start+end)>>1;//nums1二分的位置 14 partLen2=((len+1)>>1)-partLen1; //nums2二分的位置 15 //L1:nums1二分之后左边的位置,L2:nums1二分之后右边的位置 16 //R1:nums2二分之后左边的位置,R2:nums2二分之后右边的位置 17 let L1 =partLen1 === 0?-Infinity:nums1[partLen1-1]; 18 let L2 =partLen2 === 0? -Infinity :nums2[partLen2-1]; 19 let R1 =partLen1===len1?Infinity:nums1[partLen1]; 20 let R2 =partLen2===len2?Infinity:nums2[partLen2]; 21 if(L1>R2){ 22 end = partLen1 -1; 23 }else if(L2>R1){ 24 start = partLen1 +1; 25 }else{ 26 return len % 2 ===0 27 ?(Math.max(L1,L2)+Math.min(R1,R2))/2 28 :Math.max(L1,L2); 29 } 30 } 31 };
方法二:双指针
思路:
一个指针指向数组1。
一个指针指向数组2。
依次比较两个指针指向的元素的大小,谁小谁加到排序好的数组中,直到一方遍历完,将没遍历完的全部加到排序好的数组中即可。
最后判断结果数组的个数是奇数还是偶数,如果是奇数直接返回中位数元素,如果是偶数则返回中位数元素和中位数元素后边的一位元素,两者求和然后/2,返回。
1 /** 2 * @param {number[]} nums1 3 * @param {number[]} nums2 4 * @return {number} 5 */ 6 var findMedianSortedArrays = function(nums1, nums2) { 7 let left = 0; 8 let right = 0; 9 const arr = []; 10 while (left < nums1.length && right < nums2.length) { 11 if (nums1[left] <= nums2[right]) { 12 arr.push(nums1[left]); 13 left++; 14 } else { 15 arr.push(nums2[right]); 16 right++; 17 } 18 } 19 if (right === nums2.length) { 20 arr.push(...nums1.slice(left)) 21 } 22 if (left === nums1.length) { 23 arr.push(...nums2.slice(right)) 24 } 25 if (arr.length % 2) { 26 return arr[(arr.length-1) >> 1] 27 } else { 28 return (arr[(arr.length-1) >> 1] + arr[((arr.length-1) >> 1) + 1]) / 2 29 } 30 };

浙公网安备 33010602011771号