原题

链接

我的解法

  1. /**
  2. * @param {number[]} nums1
  3. * @param {number[]} nums2
  4. * @return {number}
  5. */
  6. var findMedianSortedArrays = function(nums1, nums2) {
  7. debugger
  8. const getMiddleNumber = arr =>{
  9. if(!arr.length){
  10. return undefined
  11. }
  12. const len = arr.length ;
  13. if(len%2===0){
  14. return (arr[len/2-1]+arr[len/2])/2;
  15. }else{
  16. return arr[(len-1)/2];
  17. }
  18. }
  19. if(!nums1.length){
  20. return getMiddleNumber(nums2)
  21. }
  22. if(!nums2.length){
  23. return getMiddleNumber(nums1)
  24. }
  25. let newArr = [...nums1,...nums2];
  26. newArr = newArr.sort((a,b)=>a-b);
  27. return getMiddleNumber(newArr)
  28. };

思路简单,去排序后中间位置的数即可,如果两个均是数组,那么合并后排序。(当然,两个都是有序数组的情况下,合并排序可以进行一些简化)。

空间复杂度 m+n,时间复杂度m+ n

更好的方式

把握中位数的概念,中位数其实就是取中间位置的数 。只要按照大小顺序,从小到大向后数到对应的个数的数即可,这里用到了双指针,指针位置根据当前值与两个指针中的值做灵活的跳转。
当刚好是发现循环到偶数中间次时,说明需要两个数,那么需要记录下此时的数值。

  1. /**
  2. * @param {number[]} nums1
  3. * @param {number[]} nums2
  4. * @return {number}
  5. */
  6. var findMedianSortedArrays = function(nums1, nums2) {
  7. let len1 = nums1.length;
  8. let len2 = nums2.length;
  9. if(len1>len2){
  10. return findMedianSortedArrays(nums2,nums1);
  11. }
  12. let len = len1+len2;
  13. let count=1;let preValue =0;let value = 0 ;
  14. let x=0;let y = 0 ;
  15. let countSum = len%2===0 ? len/2+1:(len+1)/2;
  16. while(count<=countSum){
  17. if(len1>0&&x<len1&&(nums2[y]===undefined||nums1[x]<=nums2[y])){
  18. value = nums1[x];
  19. x++
  20. }else{
  21. value = nums2[y];
  22. y++
  23. }
  24. if(count===len/2){
  25. preValue = value;
  26. }
  27. count++;
  28. }
  29. return len%2===0? (preValue+value)/2:value
  30. };

重点注意考虑取左侧数组的边界条件是:
1 当符合数组1小于数组2的当前数值
2 数组2已经没有数值时