原题
我的解法
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @return {number}
*/
var findMedianSortedArrays = function(nums1, nums2) {
debugger
const getMiddleNumber = arr =>{
if(!arr.length){
return undefined
}
const len = arr.length ;
if(len%2===0){
return (arr[len/2-1]+arr[len/2])/2;
}else{
return arr[(len-1)/2];
}
}
if(!nums1.length){
return getMiddleNumber(nums2)
}
if(!nums2.length){
return getMiddleNumber(nums1)
}
let newArr = [...nums1,...nums2];
newArr = newArr.sort((a,b)=>a-b);
return getMiddleNumber(newArr)
};
思路简单,去排序后中间位置的数即可,如果两个均是数组,那么合并后排序。(当然,两个都是有序数组的情况下,合并排序可以进行一些简化)。
空间复杂度 m+n,时间复杂度m+ n
更好的方式
把握中位数的概念,中位数其实就是取中间位置的数 。只要按照大小顺序,从小到大向后数到对应的个数的数即可,这里用到了双指针,指针位置根据当前值与两个指针中的值做灵活的跳转。
当刚好是发现循环到偶数中间次时,说明需要两个数,那么需要记录下此时的数值。
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @return {number}
*/
var findMedianSortedArrays = function(nums1, nums2) {
let len1 = nums1.length;
let len2 = nums2.length;
if(len1>len2){
return findMedianSortedArrays(nums2,nums1);
}
let len = len1+len2;
let count=1;let preValue =0;let value = 0 ;
let x=0;let y = 0 ;
let countSum = len%2===0 ? len/2+1:(len+1)/2;
while(count<=countSum){
if(len1>0&&x<len1&&(nums2[y]===undefined||nums1[x]<=nums2[y])){
value = nums1[x];
x++
}else{
value = nums2[y];
y++
}
if(count===len/2){
preValue = value;
}
count++;
}
return len%2===0? (preValue+value)/2:value
};
重点注意考虑取左侧数组的边界条件是:
1 当符合数组1小于数组2的当前数值
2 数组2已经没有数值时