菜鸟前端刷算法第一天

34 阅读1分钟

题目描述 - 寻找两个正序数组的中位数

给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。

算法的时间复杂度应该为 O(log (m+n)) 。

思路分析

一个正序数组的中位数即数组中间的元素, 分两种情况:

  • 若数组长度为偶数, 中位数为中间两个元素之和除二, 如:arr = [1,2,3,4], 中位数为 2.5。代码表示为:(arr[arr.length/2] + arr[arr.length/2 - 1]) / 2
  • 若数组长度为奇数, 中位数为中间的元素,如:arr = [1,2,3], 中位数为 2。代码表示为:(arr[Math.floor(arr.length/2)])

求两个正序数组的中位数, 讲两个有序数组合并为一个有序数组,并按照上面的逻辑寻找中位数即可, 代码如下:

/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number}
 */
var findMedianSortedArrays = function(nums1, nums2) {
    let tempArr = nums1.concat(nums2)
    tempArr.sort((a,b)=> a-b)
    let length = tempArr.length;
    if(length % 2 === 0){
        return (tempArr[length / 2 -1] + tempArr[length / 2]) / 2
    }else{
        return tempArr[Math.floor(length / 2)]
    }
};