原题
我的解法
/*** @param {number[]} nums1* @param {number[]} nums2* @return {number}*/var findMedianSortedArrays = function(nums1, nums2) {debuggerconst 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已经没有数值时
